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"); } }
  • 相关阅读:
    崩漏
    李翰卿治疗小儿五更咳嗽经验
    34名国宝级名老中医秘方集锦(一)
    黄煌儿科经方
    中医临床参考
    HTML 动态云启动画面
    CANVAS 水波动态背景
    PHP MYSQL单向同步方案
    PHP 获取指定目录下所有文件(包含子目录)
    JS 深度拷贝 Object Array
  • 原文地址:https://www.cnblogs.com/darrenqiao/p/9192646.html
Copyright © 2011-2022 走看看