与Java反射相关的类如下:
类名 用途
Class类 代表类的实体,在运行的Java应用程序中表示类和接口
Field类 代表类的成员变量(成员变量也称为类的属性)
Method类 代表类的方法
Constructor类 代表类的构造方法

获得类中属性相关的方法
方法 用途
getField(String name) 获得某个公有的属性对象
getFields() 获得所有公有的属性对象
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields() 获得所有属性对象
参考: https://www.jianshu.com/p/9be58ee20dee
先上一个java 类
public class ReflectDemo {
public int num;
public String str;
public ReflectDemo() {
}
public ReflectDemo(int num, String str) {
this.num = num;
this.str = str;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public void reflectPrint() {
System.out.println("reflectMethod:-----" + "---STR----" + str + "-----num:" + num);
}
}
1.反射构造函数 -空的构造
Class<?> className= Class.forName("ReflectDemo");
Object object =className.newInstance();
ReflectDemo reflectDemo=(ReflectDemo)object;
reflectDemo.setNum(123);
reflectDemo.setStr("reflect");
reflectDemo.reflectPrint();
注意,这里如果没有声明一个空的构造函数的话,是会报错的, 因为newInstance 就是创建一个空的构造函数的意思
2.反射构造函数-非空的构造
Class<?> className= Class.forName("ReflectDemo");
Constructor<?> declaredConstructorBook = className.getDeclaredConstructor(int.class,String.class);
declaredConstructorBook.setAccessible(true);
Object object =declaredConstructorBook.newInstance(213,"New Reflect");
ReflectDemo reflectDemo =(ReflectDemo)object;
reflectDemo.reflectPrint();
这里是对非空函数进行反射, 然后传入相应的值进行构造
3.反射类方法.反射相应方法进行相应的操作
Class<?> className= Class.forName("ReflectDemo");
Constructor<?> declaredConstructorBook = className.getDeclaredConstructor(int.class,String.class);
declaredConstructorBook.setAccessible(true);
Object object =declaredConstructorBook.newInstance(213,"New Reflect");
Method method= className.getMethod("getNum");
method.setAccessible(true);
int num =(int) method.invoke(object);
System.out.println(" Num--------"+num);
4.反射相应的属性
Class<?> className= Class.forName("ReflectDemo");
Constructor<?> declaredConstructorBook = className.getDeclaredConstructor(int.class,String.class);
declaredConstructorBook.setAccessible(true);
Object object =declaredConstructorBook.newInstance(213,"New Reflect");
Field field =className.getField("num");
field.setAccessible(true);
int nums =(int)field.getInt(object);
System.out.println(" Nums--------"+nums);
5.获取包名
Class<?> className= Class.forName("com.jim.demo.ReflectDemo");
System.out.println("classPackage name:==="+className.getPackageName());
网友评论