反射是什么
使用方式
1. 在知道需要反射的类的具体位置等的时候使用
package first;
public class v {
public String A = "我是public A";
private String B = "我是private B";
//构造方法也有权限,这里没写就是default,其他包无法执行
v(){
System.out.println("我是~无~参构造");
}
v(String i){
System.out.println("我是~有~参构造");
}
private void v1() {
System.out.println("private_v1");
}
public void v1(int i) {
System.out.println("public_v1_带参");
}
}
1. == 访问公开成员变量 public String A ==
//first包中的v类
Class cl = Class.forName("first.v");
//加载类 //向下转型(等价于加载类)
Object obj = cl.newInstance(); //v obj = (v)cl.newInstance();
//获取成员变量A,A是变量名
Field fl = cl.getField("A");
//输出变量A fl.get(obj),get是取值。obj是前文的加载类
System.out.println(fl.get(obj));
/*结果: 我是~无~参构造
我是A*/
2. == 访问私有成员变量 private String B ==
//first包中的v类
Class cl = Class.forName("first.v");
//加载类 //向下转型(等价于加载类)
Object obj = cl.newInstance(); //v obj = (v)cl.newInstance();
//获取成员变量B,B是变量名 getDeclaredField()方法用于获取是私有权限的,当然也能用于获取public的
Field fl = cl.getDeclaredField("B");
//取消权限检查
fl.setAccessible(true);
//输出变量A fl.get(obj),get是取值。obj是前文的加载类
System.out.println(fl.get(obj));
/*结果: 我是~无~参构造
我是B*/
3. == 修改成员变量A ==
Class cl = Class.forName("first.v");
Object obj = cl.newInstance();
Field fl = cl.getField("A");
System.out.println(fl.get(obj));
fl.set(obj,"我变成C了");
System.out.println(fl.get(obj));
/*结果: 我是~无~参构造
我是A
我变成C了*/
4. == 访问构造方法 ==
//无参
Class cl = Class.forName("first.v");
Constructor cst = cl.getDeclaredConstructor();
Object obj = cst.newInstance();
//结果:我是~无~参构造
//有参
Class cl = Class.forName("first.v");
//获取指定的有参构造 String是v类中参数处定义的
Constructor cst = cl.getDeclaredConstructor(String.class);
//加载类 向下转型(等价于加载类)
Object obj = cst.newInstance("s"); //v obj = (v)cl.newInstance("s");
//结果:我是~有~参构造
5. == 访问private无参方法 v()==
Class cl = Class.forName("first.v");
Object obj = cl.newInstance();
//获取方法V1() "v1"是方法
Method m = cl.getDeclaredMethod("v1");
//取消权限检查
m.setAccessible(true);
//obj是前文的加载类
m.invoke(obj);
/*结果 : 我是~无~参构造
private_v1
*/
6. == 访问public有参方法 v1(int i)==
Class cl = Class.forName("first.v");
Object obj = cl.newInstance();
//获取方法V1() "v1"是方法 int是方法自定参数类型
Method m = cl.getDeclaredMethod("v1", int.class);
//obj是前文的加载类 10是int型,随便输入个int数就行
m.invoke(obj, 10);
/*结果 : 我是~无~参构造
public_v1_带参
*/