Java 反射与动态代理

2023-05-02 10:59:14 浏览数 (1)

本文最后更新于 408 天前,其中的信息可能已经有所发展或是发生改变。

java反射机制

反射机制允许程序在运行期借助于Reflection API取得任何类的内部信息,并能直接操作任意类和对象的所有属性及方法。

要使用一个类,就要先把它加载到虚拟机中,在加载完类之后,堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个class对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构,这个对象就像一面镜子,透过镜子可以看到类的结构,所以形象的称之为:反射。

反射中会经常使用到的方法:

代码语言:javascript复制
1、获取Class实例的方式
    方式1:调用运行时类的属性 .class   
    方式2:通过运行时的对象调用getClass()   
    方式3:调用Class的静态方法:forName(String classPath)   
    方式4:使用类的加载器  classloader
2、创建运行时类的对象   
    newInstance()  调用此方法,创建对应的运行时类的对象
3、获取运行时类的结构   
    getFields()  获取当前运行时类及其父类中声明为public访问权限的属性   
    getDeclaredFields()  获取当前运行时类中声明的所有属性,不包含父类   
    getMethods() 获取当前运行时类及其所有父类声明为public的方法   
    getDeclaredMethods()  获取当前运行时类中声明的方法,不包含父类   
    getConstructors() 获取当前运行时类声明为public的构造器   
    getDeclaredConstructors()  获取当前运行时类中声明的所有构造器   
    invoke()方法允许调用包装在当前Method对象中的方法

反射示例:

如下代码中,Object i = m1.invoke(r1, 1, 2)的作用是:使用r1调用m1获得的对象所声明的公开方法即print,并将int类型的1,2作为参数传入。

代码语言:javascript复制
import java.lang.reflect.Method;
public class test {
    public static void main(String[] args) {
        Reflect r1=new Reflect();
        //通过运行时的对象调用getClass();
        Class c=r1.getClass();
        try {
            //getMethod(方法名,参数类型)
            //getMethod第一个参数是方法名,第二个参数是该方法的参数类型
            //因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
            Method m1 = c.getMethod("print", int.class, int.class);

            //相当于r1.print(1, 2);方法的反射操作是用m1对象来进行方法调用 和r1.print调用的效果完全相同
            //使用r1调用m1获得的对象所声明的公开方法即print,并将int类型的1,2作为参数传入
            Object i = m1.invoke(r1, 1, 2);

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
class Reflect{
    public void print(int a,int b){
        System.out.println(a b);
    }
}

浏览量: 45

0 人点赞