java反射机制

来源:互联网 发布:linux 禁用ping 编辑:程序博客网 时间:2024/06/07 22:15
Class
    提供了字节码文件对象,提供了获取字节码文件中的内容,比如:名称,字段,函数
    反射就是通过该类进行完成的。
Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

package com.dong.bean;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
 * 要想对字节码文件进行解剖,必须获取字节码文件对象
 * 获取字节码文件对象的三种方式:
 * 1:Object类中的getClass()方法,想要用这种方式,必须要明确具体的类并创建对象。
 * 2:任何数据类型都具备一个静态的属性.class来获取对应的Class对象。相对来说比较简单,但是还是要明确用到类中的静态成员。
 * 3:只要通过给定的类的字符串名称就可以获取该类,更为扩展。可以使用Class中的方法完成。该方法就是Class.forName(),这种方式只要有名称即可,更为方便,扩展性更强。
 */
public class ReflectDemo {
    
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
        /**
         * 早期:new的时候,先根据被new的类的名称寻找该类的字节码文件,并加载进内存;
         * 同时创建该字节码文件对象,并接着创建该字节码文件的对应的Person对象。
         */
        com.dong.bean.Person p = new com.dong.bean.Person();
        
        /**
         * 现在:找寻该名称类文件,加载进内存,并产生Class对象。
         */
        Class clazz = Class.forName("com.dong.bean.Person");
        Object obj = clazz.newInstance();//创建该Class对象的实例,调用空参的构造函数
        Constructor constructor = clazz.getConstructor(int.class,String.class);//获取指定参数类型的构造函数对象
        Object obj1 = constructor.newInstance(11,"lili");
        clazz.getFields();//clazz.getField("name") 只能获取共有的字段
        Field field = clazz.getDeclaredField("age");//可以获取所有的字段
        field.setAccessible(true);//对私有的字段的访问取消权限限制,暴力访问
        System.out.println(field.get(obj1));//获取字段属性的值
        field.set(obj1, 89);
        System.out.println(field.get(obj1));//设置字段属性的值  
    }
}  
获取对象方法并执行
public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("com.dong.bean.Person");
        Method[] methods = clazz.getMethods();//获取的都是共有的方法 包含父类中的方法
        methods = clazz.getDeclaredMethods();//获取类自身的方法 
        for(Method m : methods ){
            System.out.println(m);
        }
        Method method = clazz.getMethod("show",null);//获取空参数方法
        Constructor constructor = clazz.getConstructor(int.class,String.class);//得到指定参数的构造函数
        method.invoke(constructor.newInstance(25,"aaaa"),null );//执行method对象的调用函数 传入参数 调用该方法的对象,该方法需要的参数
        Method paramMethod = clazz.getMethod("paramMethod"int.class);
        paramMethod.invoke(clazz.newInstance(), 26);
        Method priMethod = clazz.getDeclaredMethod("priMethod"null);//只能获取 类自身的方法
        priMethod.setAccessible(true);//私有的方法需要先设置为可访问的
        priMethod.invoke(clazz.newInstance(), null);  
    }
0 0
原创粉丝点击