小编最近重新看了下java反射,如何取对象,属性,方法等,然后做了简单的test测试,在此分享一下。
程序员不多说,直接上代码。
我们建一个类Myclass,设置私有属性a,public属性b
public class MyClass {
private String a;
public String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}
再创建一个test类,main方法如下代码
try {
Class c3 = Class.forName("thread.MyClass");
// 反射创建对象
// MyClass myClass2 = (MyClass) c3.newInstance();
Object myClass2 = c3.newInstance();
// 获取类的属性 public/继承
Field[] fields = c3.getFields();
for (Field field : fields){
System.out.println("所有的public属性:"+field);
}
// 获取类的属性 public/private 不包括继承
Field[] fields2 = c3.getDeclaredFields();
for (Field field : fields2){
System.out.println("所有的public/private属性:"+field);
}
// 获取指定的public属性
Field f1 = c3.getField("b");
// 获取本身的属性
Field f2 = c3.getDeclaredField("b");
// Field f3 = c3.getField("a");// 获取不到
Field f3 = c3.getDeclaredField("a");
// f1.setAccessible(true);// 允许访问私有变量,访问共有变量不用加
f1.set(myClass2,"1");
// 设置值
f3.setAccessible(true);// 允许访问私有变量,访问共有变量不用加
f3.set(myClass2,"2");
// 获取值
String b = (String) f1.get(myClass2);
System.out.println("属性b的值:"+b);
// 获取值
String a = (String) f3.get(myClass2);
System.out.println("属性a的值:"+a);
// 获取所有方法
Method[] methods = c3.getMethods();
for (Method method : methods){
System.out.println("class的方法:"+method);
}
// 获取私有变量,get方法
String a1 = (String) c3.getMethod("getA").invoke(myClass2);
System.out.println("属性a的值:"+a1);
} catch (Exception e) {
e.printStackTrace();
}
这段代码可以根据注释看对Myclass做了反射创建对象,2种获取属性名的方法,获取属性的值,给属性设置值,活期class的所有方法以及根据方法名获取方法并执行。
测试类对所有异常统一exception处理,实际应用可以根据需要捕获各种异常进行处理。小伙伴们了解反射的应用后可以做参数化封装而做一些工具类使用。
希望在此可以帮助到萌新的应用。