Java反射机制

2019-05-24  本文已影响0人  易点梅

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

反射就是把java类中的各种成分映射成一个个的Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)

1、method.invoke(obj,params)

2、constructor.newInstance()

反射的用途

一、通过反射运行配置文件内容

二、通过反射越过泛型检查

 获取构造方法:

1.批量的方法:

         public Constructor[] getConstructors():所有”公有的”构造方法

          public Constructor[] getDeclaredConstructors():获取所有的构造方法(包括私有、受保护、默认、公有)

2.获取单个的方法,并调用:

          public Constructor getConstructor(Class… parameterTypes):获取单个的”公有的”构造方法:

          public Constructor getDeclaredConstructor(Class… parameterTypes):获取”某个构造方法”可以是私有的,或受保护、默认、公有;

3.调用构造方法:

         Constructor–>newInstance(Object… initargs)

获取成员方法并调用:

1.批量的:

    public Method[] getMethods():获取所有"公有方法";(包含了父类的方法也包含Object类)

    public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的)

 2.获取单个的:

   public Method getMethod(String name,Class<?>... parameterTypes):

                 参数:

                     name : 方法名;

                    Class ... : 形参的Class类型对象

   public Method getDeclaredMethod(String name,Class<?>... parameterTypes)

3.调用方法:

    Method --> public Object invoke(Object obj,Object... args):

                参数说明:

                 obj : 要调用方法的对象;

               args:调用方式时所传递的实参;

获取成员变量并调用:

 1.批量的

     1).Field[] getFields():获取所有的"公有字段"

     2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;

 2.获取单个的:

     1).public Field getField(String fieldName):获取某个"公有的"字段;

     2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)

3. 设置字段的值:

     Field --> public void set(Object obj,Object value):

                  参数说明:

                 1.obj:要设置的字段所在的对象;

                 2.value:要为字段设置的值;

以后详写

动态代理

publicinterface Interface {

    void doSomething();

    void somethingElse(String arg);

}

public class RealObject implements Interface {

    publi cvoid doSomething() {

        System.out.println("doSomething.");

    }

    public void somethingElse(String arg) {

        System.out.println("somethingElse " + arg);

    }

}

public class DynamicProxyHandler implements InvocationHandler {

    private Object proxyed;

    public DynamicProxyHandler(Object proxyed) {

        this.proxyed = proxyed;

    }

    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

        System.out.println("代理工作了.");

        return method.invoke(proxyed, args);

    }

}

public class Main {

    public static void main(String[] args) {

        RealObject real = new RealObject();

        Interface proxy = (Interface) Proxy.newProxyInstance(

                Interface.class.getClassLoader(), new Class[] {Interface.class},

                new DynamicProxyHandler(real));

        proxy.doSomething();

        proxy.somethingElse("luoxn28");

    }

}

上一篇 下一篇

猜你喜欢

热点阅读