• Java反射机制简单学习


    java中除了基本数据类型,几乎都为对象。例如

    Person p=new Person(); 这句语句表明了p是Person类的一个实例对象。但其实,Person也是一个实例对象,它是Class类的实例对象(java.lang.Class)。

    Person的实例对象是通过new来获取的,但是Class的实例对象我们却不能这样new出来,因为通过源码我们会发现Class的构造方法是已经私有化了。

    如果我们要获取Class的实例对象(即官方中的类类型,后文将用以区分普通的实例对象),有三种方式。

    1.通过类.class来获取

    package reflect;
    
    public class Demo1 {
        public static void main(String[] args) {
            Person person = new Person();
            Class p=Person.class;
        }
    }
    
    class Person{
        
    }

    2.通过对象的getClass方法来获取

    package reflect;
    
    public class Demo1 {
        public static void main(String[] args) {
            Person person = new Person();
            Class p=person.getClass();
        }
    }
    
    class Person{
        
    }

    3.通过动态加载(后文有作解释何为动态加载)

    package reflect;
    
    public class Demo1 {
        public static void main(String[] args) {
            try {
                Class p=Class.forName("reflect.Person");
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    class Person{
        
    }

    总共三种方式可以获取Class的实例对象p,这个p就称之为Person的类类型。

    动态加载和静态加载:

     普通的利用构建方法new的方式称之为静态加载,而通过Class.forName(String name)的方法找到其类类型,再new Instance方式创建其对象的

    方式称之为动态加载。

    区别:静态加载时发生在编译时,就是编译过程中会去创建对象,如果发现问题会报错。而动态加载则是在运行过程中才会去加载,并才会去发现错误。

    好处就是,动态加载能够在不改变原有的情况下,增加新的功能。

    例如:

    静态加载:

    package reflect;
    
    
    /**
     * 静态加载
     * @author Administrator
     *
     */
    public class Demo2 {
        public static void main(String[] args) throws Exception {
            Person1 p=new Person1();  //报错 编译报错
            
        }
    }

    动态加载:

    package reflect;
    
    
    /**
     * 动态加载
     * @author Administrator
     *
     */
    public class Demo2 {
        public static void main(String[] args) throws Exception {
            Class clazz=Class.forName("reflect.Person");
            Object obj=clazz.newInstance();
            
        }
    }

    类类型--反射:

    通过类类型我们可以获取到该类几乎所有的信息,包括成员方法以及成员变量。

    大部分的方法都可以通过api或者ide工具了解并使用。需要注意的是method的反射。(getDeclaredMethod()和getMethod()  前者或者本类声明的函数,不管方法访问权限。而getMethod获取的是public的,包括父类集成或者接口继承的方法)

    package reflect;
    
    import java.lang.reflect.Method;
    
    /**
     * 方法的反射
     * @author Administrator
     *
     */
    public class Demo2 {
        public static void main(String[] args) throws Exception {
            Class n=Class.forName("reflect.NumUtil");
            Object obj = n.newInstance();
            Method method = n.getDeclaredMethod("testAdd", int.class,int.class);
            method.invoke(obj, 1,2);
        }
    }
    
    
    
    class NumUtil{
        
        void testAdd(int a,int b){
            
            System.out.println("testadd的方法:"+(a+b));
        
        }
        
    }
  • 相关阅读:
    完全备份、差异备份以及增量备份的区别(转)
    Backup Exec Inventory 与Catalog的含义(转载)
    从客户端中检测到有潜在危险的Request.Form值的解决办法
    IQueryable与IEnumberable的区别(转)
    SQL递归查询(with cte as) 物料分解
    Http权威指南笔记(二) Http状态码大全
    Http权威指南笔记(一) URI URL URN 关系
    echarts在.Net中使用实例(二) 使用ajax动态加载数据
    echarts在.Net中使用实例(一) 简单的Demo
    sql显示12个月数据
  • 原文地址:https://www.cnblogs.com/cztisthebest/p/6284678.html
Copyright © 2020-2023  润新知