zoukankan      html  css  js  c++  java
  • Java反射机制

    背景知识

    • Class类(反射机制实现的基础)

         Java中的Class的类是一个特殊的类,JVM加载字节码文件的时候,在方法区中为每一个类创建一个对应的Class类对象,这个对象中包含类的信息:方法,字段,注解等。

    是什么
      可以在运行时动态的获取类的信息。(比如:类里面定义的方法,字段,注解等信息)


    有什么用
      可以提高程序的可扩展性,以前没新增加一个类就需要修改原来的程序,以兼容新的类,现在只需要通过反射就能够获取到新增的自定义类信息,不需要每次修改原来的程序。

    编程实例,代码中会包含以下几个部分的实现。

    • 如何获取类的信息(三种方法)
    • 如何通过构造函数串参数
    • 如何获取到一个指定的函数,并执行

    首先,先定义一个用于反射的类

    package priv.darrenqiao.reflection;
    
    /*
     * @Author : darrenqiao
     * */
    
    public class ReflectionClass {
        public String name;
        public Integer age;
        
        private String result;
        public void testName() {
            
        }
        
        public ReflectionClass(String result) {
            super();
            this.result = result;
        }
    
        public void show(String test) {
            System.out.println("show result " + this.result + " and " + test);
        }
        
        public void testAge() {
            
        }
        
    }

    然后我们通过main方法类进行反射机制的实现package priv.darrenqiao.reflection;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    /*
     * @Author : darrenqiao
     * */
    
    public class Main {
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
            
         
    //获取类方法一 ReflectionClass reflection = new ReflectionClass("success"); Class<?> classInfoForReflection = reflection.getClass(); //获取类方法二 //Class<ReflectionClass> classInfoForReflection = ReflectionClass.class; //获取类方法三,比较常用的是这种,因为后面的类全路径可以作为配置项放到配置文件中动态的获取 //Class<?> classInfoForReflection = Class.forName("priv.darrenqiao.reflection.ReflectionClass"); Method[] methods = classInfoForReflection.getMethods(); System.out.println("methods for class classInfoForReflection is"); for (Method m : methods) { System.out.println(m.getName()); } //通过构造函数传参数 Class<ReflectionClass> classInfoForReflectionClass = ReflectionClass.class; Constructor<?> c = classInfoForReflectionClass.getConstructor(String.class);
    Object reflectionObject
    = (Object) c.newInstance("failed"); //执行指定函数 Method method = classInfoForReflectionClass.getMethod("show", String.class); method.invoke(reflectionObject, "test final"); } }
  • 相关阅读:
    每日总结3.8
    Go中定时器实现原理及源码解析
    Go语言实现布谷鸟过滤器
    详解Go语言调度循环源码实现
    Go语言中时间轮的实现
    详解Go语言I/O多路复用netpoller模型
    详解Go中内存分配源码实现
    Go中由WaitGroup引发对内存对齐思考
    【分享】java精品实战教程
    nginx实战教程
  • 原文地址:https://www.cnblogs.com/darrenqiao/p/9192646.html
Copyright © 2011-2022 走看看