本文目录一览:
- 通过java 反射 调用bean中的get方法
- java 反射 数据类型转换
- java反射机制详解
- java 代码 通过反射获取spring 注入的bean 然后执行方法,额,如果我是一个java 类中main里面可以这样吗
- Java反射的功能:从json到bean
- java中反射的三种方法是?
通过java 反射 调用bean中的get方法
public String getValue(User u, String name) {
String value = "";
Method[] m = u.getClass().getMethods();
for (int i = 0; i < m.length; i++) {
if (("get" + name).toLowerCase().equals(m[i].getName().toLowerCase())) {
try {
value = (String) m[i].invoke(u);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return value;
}
java 反射 数据类型转换
给你一段属性反射的代码,你自己看着改吧:
Field[] fs = userCla.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
f.setAccessible(true); // 设置此属性是可以访问的
Object val = f.get(bean); // 得到此属性的值
System.out.println("name:" + f.getName() + "\t value = " + val);
String type = f.getType().toString(); // 得到此属性的类型
if (type.endsWith("String")) {
System.out.println(f.getType() + "\t是String");
f.set(bean, "12"); // 给属性设值
} else if (type.endsWith("int") || type.endsWith("Integer")) {
System.out.println(f.getType() + "\t是int");
f.set(bean, 12); // 给属性设值
} else {
System.out.println(f.getType() + "\t");
}
}
基本就是 getType()
之后,根据 type
的类型来反射。
java反射机制详解
反射就是把 Java 的各种成分映射成相应的 Java 类。
Class
类的构造方法是 private
,由 JVM 创建。
反射是 Java 语言的一个特性,它允许程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个 Java 的类获取它所有的成员变量和方法并且显示出来。Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。(来自 Sun)
JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。
反射是从 1.2 就有的,后面的三大框架都会用到反射机制,涉及到类 Class
,无法直接 new Class()
,其对象是内存里的一份字节码。
Class
类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class
对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class
对象。
基本的 Java 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 void
也表示为 Class
对象。Class
没有公共构造方法。
Class
对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass
方法自动构造的。
Person p1 = new Person();
// 下面的这三种方式都可以得到字节码
Class c1 = Date.class;
p1.getClass();
// 若存在则加载,否则新建,往往使用第三种,类的名字在写源程序时不需要知道,到运行时再传递过来
Class.forName("java.lang.String");
Class.forName()
字节码已经加载到 Java 虚拟机中,去得到字节码;Java 虚拟机中还没有生成字节码,用类加载器进行加载,加载的字节码缓冲到虚拟机中。
考虑下面这个简单的例子,让我们看看 reflection 是如何工作的:
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName("java.util.Stack");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}
输出结果:
public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized int java.util.Stack.search(java.lang.Object)
这样就列出了 java.util.Stack
类的各方法名以及它们的限制符和返回类型。这个程序使用 Class.forName
载入指定的类,然后调用 getDeclaredMethods
来获取这个类中定义了的方法列表。java.lang.reflect.Method
是用来描述某个类中单个方法的一个类。
以下示例使用 Class
对象来显示对象的类名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class
对象。例如:
System.out.println("The name of class Foo is: " + Foo.class.getName());
在没有对象实例的时候,主要有两种办法:
// 获得类类型的两种方式
Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");
注意第二种方式中,forName
中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。现在得到 cls1
就可以创建一个 Role
类的实例了,利用 Class
的 newInstance
方法相当于调用类的默认的构造器。
Object o = cls1.newInstance(); // 创建一个实例
// Object o1 = new Role(); // 与上面的方法等价
java 代码 通过反射获取spring 注入的bean 然后执行方法,额,如果我是一个java 类中main里面可以这样吗
可以啊。获取了 Spring 管理的 bean 就可以操作。 在 main 方法里执行或者使用 JUnit 测试都是一样的。
Java反射的功能:从json到bean
为了实现异步传输(Ajax),通常服务器和浏览器之间的交互都是通过 JSON 来完成的。
客户端(浏览器)执行相应的代码,可以将获取到的 JSON 通过使用 Prototype 提供的 evalJSON
函数转换成 JS 对象。
java中反射的三种方法是?
第一种:通过 forName()
方法;
第二种:类 .class
;
第三种:对象 .getClass()
。
举例如下:
package test;
public class Demo {
public static void main() {
Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null;
// 三种反射用实例化方式
try {
// 最常用的一种形式
c1 = Class.forName("test.X");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 通过 Object 类中的方法实例化
c2 = new X().getClass();
// 通过类.class实例化
c3 = X.class;
System.out.println("类名:" + c1.getName()); // 得到类名
System.out.println("类名:" + c2.getName()); // 得到类名
System.out.println("类名:" + c3.getName()); // 得到类名
}
}