反射reflect

Posted lamsey16

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射reflect相关的知识,希望对你有一定的参考价值。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

Class

众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。

Method method = getClass().getDeclaredMethod(action, HttpServletRequest.class,HttpServletResponse.class);

method.invoke(this, request,response);

 

1.理解Class类对象并实例化Class类对象

java.lang.Class是反射的源头

在Object类中定义了

 public final native Class<?> getClass();

会被所有子类继承,返回值是一个Class类,此类事java反射的源头。

类加载器:把类装载进内存

jvm规范

1)启动类加载器

 2)用户自定义加载器

jvm运行时产生3个类加载器:

1)引导类加载器:java平台的核心库

2)扩展类加载器:负责jre/lib/ext目录下的jar包。。。

3)系统类加载器

 

 

java.lang.reflect.Method代表类的方法

java.lang.reflect.Field:代表类的成员变量

java.lang.reflect.Constructor:代表类的构造方法

 

2.运行时创建类对象并获取完整结构

有了Class对象,能做什么?

        //通过Class静态方法获取
        String className = "com.lamsey.Person";
        Class<?> class1 = Class.forName(className);
        System.out.println("class1:"+class1);
        
        //获得class后干啥?
        //创建类的对象:调用Class的newInstance方法
        /**
         * 需求:1)创建的类必须有一个无参的构造器
         *        2)类的构造器访问权限足够
         */
     //无参构造器创建对象
Person person = (Person) class1.newInstance(); System.out.println("person:"+person);

     //有参构造器创建对象 Constructor<?> constructor = class1.getDeclaredConstructor(String.class,int.class); System.out.println("constructor: "+constructor); Person object = (Person) constructor.newInstance("123",12); System.out.println(object);

 

 

 

3.通过反射调用类的指定方法、指定属性

 

 

 

 

 

 

4、动态代理

 

 

 

在程序运行时根据动态创建目标类的代理对象

 

以上是关于反射reflect的主要内容,如果未能解决你的问题,请参考以下文章

golang基础--reflect反射

二详解 DVWA_Reflected反射型XSS

Go 每日一库之 reflect

Reflection反射机制原理使用场景 及 缺陷

Go 每日一库之 reflect

二详解 DVWA_Reflected反射型XSS