美文网首页
java反射机制

java反射机制

作者: 泽林呗 | 来源:发表于2019-03-14 21:50 被阅读0次

java反射机制是为了动态获取类的结构,动态地调用对象的方法

java反射机制

获取类Class对象
  1. A.class :不会加载类,也不会执行静态代码段;
  2. Class.forName("cn.test.reflect.A") :要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段;
  3. new A().getClass() :通过对象获取class
public class TestFanshe2 {
    public static void main(String[] args) throws ClassNotFoundException {
        Class.forName("aboutjava.TestFanshe");
        System.out.println(TestFanshe.class);
        new TestFanshe();
    }
}
class TestFanshe {
    static{
        System.out.println("静态代码段!");
    }
}

我们这里可以看到,当没注释掉forName方法的时候,会输出TestFanshe类的静态方法块,但是它只是加载了,还没有链接和初始化,当运行New TestFanshe()时,不会再加载,而是直接初始化,调用<init>方法。

创建对象
//调用public的无参构造函数
        Class t = Class.forName("aboutjava.TestFanshe");
        t.newInstance();
        //通过选择构造器创建对象
        Constructor cons[] = t.getConstructors();
        cons[0].newInstance();

动态代理

package aboutjava;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class TryDongtaidaili {
    interface Animal {
        public void makeSound(String name);
    }

    static class Dog implements Animal {

        @Override
        public void makeSound(String name) {
            System.out.println("Hi," + name + ",wang,wang~~");
        }
    }

    class Cat implements Animal {

        @Override
        public void makeSound(String name) {
            System.out.println("Hi," + name + ",miao,miao~~");
        }
    }

    static class AnimalProxy implements InvocationHandler {

        private Object target;

        public Object getInstance(Object target) {
            this.target = target;
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                    this);
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = null;
            System.out.println("方法调用前~");
            result = method.invoke(target, args);
            System.out.println("方法调用后~");
            return result;
        }
    }

    public static void main(String[] args) {
        AnimalProxy proxy = new AnimalProxy();
        Animal dogProxy = (Animal) proxy.getInstance(new Dog());
        dogProxy.makeSound("dog");
    }
}

动态代理主要是实现一个InvocationHandler接口和通过一个Proxy类获得一个代理。

Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                    this);

Proxy通过newProxyInstance获取到代理类,三个参数分别是,类加载器、类实现的接口、链接的InvocationHandler类,这样当proxy调用方法的时候,其实就是调用了InvocationHandler类的invoke方法,并通过method对象的invoke方法调用具体方法

相关文章

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

网友评论

      本文标题:java反射机制

      本文链接:https://www.haomeiwen.com/subject/lvhhmqtx.html