java反射的初步探索

Posted li7anstrugglepath

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射的初步探索相关的知识,希望对你有一定的参考价值。

reflect包中的Class类(注意是大写C)——类型标识类-Class

import java.lang.reflect;

反射reflection:程序可以访问、检测和修改它本身状态或行为的能力,即自描述和自控制。

       可以在运行时加载、探知、使用编译期间完全未知的类

       可以在运行时查看和操作对象:基于反射自由创建对象、set或get无法访问的成员变量、调用不可访问的方法等

 

即,可以通过“反射”获得类的所有信息,比如

1.Field:成员变量/属性

 1 class A{
 2     public int age;
 3     private String name;
 4   
 5     //A的构造函数
 6     public A(int age, String name)
 7     {
 8          this.age = age;
 9          this.name = name;
10     }
11 
12 A obj = new A(20, "li7an");
13 Class c = obj.getClass();//得到类型标识
14 
15 //获取本类及父类所有的public属性
16 Field[] fs = c.getFields();
17 
18 //获取本类自己声明的所有public/protected/default/private属性
19 Field[] fs2 = c.getDeclaredFields();
20 for(Field f: f2)
21 {
22     f.setAccessible(true);//这个方法使得protected/private属性也可调用,临时都变为public的
23 }

 

2.Method:成员方法类

class B{
public void f1(){
out.println("B.f1()");
}
private String f2(String s){
out.println("B.f2()")
return s;
}
B obj = new B();
Class c = obj.getClass();

//获取public方法
Method[] ms = c.getMethods();
for(method m:ms){
    if("f1".equals(m.getName())){
        m.invoke(obj, null);//反射中调用某个方法时,用invoke方法,此时必须传入一个对象如这里的“obj”后才能调用
    }
}

//获得该类的所有方法
Method[] ms2 = c.getDeclaredMethods();
for(Method m:ms2){
    if("f2".equals(m.getName())){
        m.setAccessible(true);//又来啦
        String result = (String)m.invoke(obj,"abc");
        out.println(result);
    }
}

 这里的m.setAccessble(true);只是临时把private/protected方法变成了private不影响B类中其他对象,其new新的B类对象时,

f2方法仍是不可见的

****************************************

注:类名.class 和类名.getClass()方法是一样的

 

以上是关于java反射的初步探索的主要内容,如果未能解决你的问题,请参考以下文章

将vscode打造成无敌的IDE初步探索vscode,解放生产力

Java反射-初步入门

Java反射探索研究(转)

Java 初步了解反射机制

GitHub初步探索-1-使用本地代码仓库,简化上传的过程

2017年8月27日 反射的初步认识