java的反射机制

每当我们编写并且编译一个新创建的类java虚拟机就会产生一个对应的Class对象,并且这个Class对象会被保存在同名.class文件里。当我们new一个新对象或者引用静态成员变量时,java虚拟机中的类加载器就会将对应的Class对象加载到java虚拟机中,然后java虚拟机再根据这个Class对象的相关信息创建我们需要的实例对象或提供静态变量的引用值。需要特别注意的是,每个class类,无论创建多少个实例对象,在JVM中都对应同一个Class对象。

几种能够获取Class对象的方法

1:Object.getClass(),通过对象实例获取对应Class对象,注意对于基本类型无法使用该方法获取Class对象。
2:通过类的类型获取Class对象,基本类型也可以使用这种方法,比如Class c=boolean.class;
3:Class.forName(),通过类的全限定名获取Class对象,基本类型无法使用该方法获取Class对象,比如Class c=Class.forName("java.lang.String");
4:Class.getSuperclass(),获得给定类的父类Class

使用总结:

1:只要是获取private修饰的构造方法(Constructor),成员变量(Field),成员方法(Method)的时候,调用的方法中都会包含Declared这个词,public修饰的就不用调用该方法。
2:只要是调用private修饰的构造方法,成员变量,成员方法,都要使用setAccessible方法来跳过权限检查。

示例一:成员变量public,构造方法private的情况下,给new一个实例

public class CeShi {
    public static void main(String[] args) {
        Class student=Student.class;
        try {
            Constructor<Student> constructor=student.getDeclaredConstructor(String.class,int.class,String.class);
            constructor.setAccessible(true);
            try {
                Student student1= constructor.newInstance("laoliang",24,"taiyuan");
                System.out.println(student1.toString());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
class Student{
    public String name;
    public int age;
    public String address;
    private Student(String name,int age,String adderss){
        this.name=name;
        this.age=age;
        this.address=adderss;
    }

    @Override
    public String toString() {
        return "名字为"+name+"年龄为"+age+"地址为"+address;
    }
}

示例二:成员变量private,构造方法public的情况下,给成员变量赋值

public class CeShi {
    public static void main(String[] args) {
        Class student=Student.class;
        try {
            Constructor<Student> constructor=student.getDeclaredConstructor(String.class,int.class,String.class);
            try {
                Student student1= constructor.newInstance("laofu",22,"xiaoyi");
                Field name=student.getDeclaredField("name");
                name.setAccessible(true);
                name.set(student1,"laoliang");
                Field age=student.getDeclaredField("age");
                age.setAccessible(true);
                age.setInt(student1,24);
                Field address=student.getDeclaredField("address");
                address.setAccessible(true);
                address.set(student1,"taiyuan");
                System.out.println(student1.toString());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
class Student{
    private String name;
    private int age;
    private String address;
    public Student(String name,int age,String adderss){
        this.name=name;
        this.age=age;
        this.address=adderss;
    }

    @Override
    public String toString() {
        return "名字为"+name+"年龄为"+age+"地址为"+address;
    }
}

示例三:通过反射来访问private修饰的成员方法

public class CeShi {
    public static void main(String[] args) {
        Class student=Student.class;
        try {
            Constructor<Student> constructor=student.getDeclaredConstructor(String.class,int.class,String.class);
            try {
                Student student1= constructor.newInstance("laoliang",24,"taiyuan");
                Method method=student.getDeclaredMethod("getMethod",String.class);
                method.setAccessible(true);
                String s= (String) method.invoke(student1,"你好啊");
                System.out.println(s);
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
class Student{
    private String name;
    private int age;
    private String address;
    public Student(String name,int age,String adderss){
        this.name=name;
        this.age=age;
        this.address=adderss;
    }

    @Override
    public String toString() {
        return "名字为"+name+"年龄为"+age+"地址为"+address;
    }
    private String getMethod(String canShu){
        return "我是私有方法,你输入的参数是"+canShu+",并且你的"+toString();
    }

参考文章
www.greatytc.com/p/607ff4e79a13

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,901评论 18 399
  • Java 语言允许通过程序化的方式间接对 Class 进行操作, Class 文件由类装载器装载后,在 JVM 中...
    deniro阅读 5,127评论 0 40
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,936评论 0 62
  • 晚上到车站接下午从长沙回来的你,我到的时候你刚下车。路上下着小雨,你把你的优秀学员标志送给了我,还不忘说一句“好舍...
    寻找大米的蚊子阅读 1,748评论 0 0
  • 作者:璇璇 早上起床后,璇璇给小妞拿来头一天小妞选好的衣服 穿裤子的时候,小妞说:妈妈,这个裤子昨天穿过了,换一条...
    彭洋盛青阅读 1,280评论 0 1