0
点赞
收藏
分享

微信扫一扫

反射的使用

年夜雪 2022-02-09 阅读 82

反射是什么

使用方式

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_带参
*/

2. 通过继承的类来获取被继承的类

3. 好像是还有一个,以后用到在记录

举报

相关推荐

0 条评论