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"); } }
  • 相关阅读:
    PayPal(贝宝)支付接口、文档、IPN
    C# LiveUpdate.exe实现文件在线更新升级
    C# 邮件发送
    VisualStudio11预览
    zen coding for visual studio 2010(vs2010)
    淘宝API开发系列淘宝API相关了解
    多年积累
    专业淘友必不可少的资料,教你如何玩转淘宝!
    极速理解设计模式系列
    ASP.NET开发人员经常使用的三十三种代码
  • 原文地址:https://www.cnblogs.com/darrenqiao/p/9192646.html
Copyright © 2011-2022 走看看