java的反射机制理解

1、概念说明java

java的反射机制,是在运行状态下,能够动态获取任意一个类的属性和方法;能够动态调用一个对象任意方法;spring

2、反射相关类jvm

java.lang.Class; //类               
java.lang.reflect.Constructor;//构造方法 
java.lang.reflect.Field; //类的成员变量       
java.lang.reflect.Method;//类的方法
java.lang.reflect.Modifier;//访问权限

3、应用场景性能

1.获取对象及成员变量this

package com.reflect.dto对象

public class RequestDTO{字符串

private String userId;get

private String userName;io

}class

调用:

Class classz=Class.forName("com.reflect.dto.RequestDTO");

Object obj=classz.newInstance();

if(classz instance of RequestDTO){

RequestDTO requestDTO=(RequestDTO )obj;

}

Field field=classz.getField("userName");

field.set(requestDTO,"ZHANGSAN");

2.经过反射运行配置文件内容

(1)resource.properties

className=com.reflect.dto.RequestDTO

methodName=getUserId

(2)解析配置文件

public static String getValue(String key){

Properties pro=new Properties();

FileReader in=new FileReader("resource.properties");

pro.load(in);

in.close();

return pro.getProperty(key);

}

(3)调用

Class classz =Class.forName(getValue("className"));//获取类

Object obj=classz.getConstructor().newInstance();//实例化对象

Method method=classz.getMethod(getValue("methodName"));//获取方法

method.invoke(obj);//调用方法

3.经过反射跳过泛型检查(在一个String的ArrayList中存储一个Integer的值方法)

ArrayList<String> arrayList=new ArrayList<>();

arrayList.add("张三");

Class classz=arrayList.getClass();

Method m=classz.getMethod("add",Object.class);

m.invoke(arrayList,100);

遍历打印出来,后就是:

张三

100

4.经过反射获取对象中注解

package com.annotation

@MyClassAnnotation(desc = "The class", uri = "com.test.annotation.Test")

public class TestAnnotation{

@MyMethodAnnotation(desc = "The class method", uri = "com.test.annotation.Test#setId")
    public void setId(String id) {
        System.out.println(" method info: "+id);
        this.id = id;
    }

}

Class classz =Class.forName("com.annotation.TestAnnotation");

MyClassAnnotation myClassAnnotation=classz.getAnnotation(MyClassAnnotation.class);

myClassAnnotation.desc();

Method m=classz.getMethod("setId",new Class[]{int.class});

MyMethodAnnotation myMethodAnnotation=m..getAnnotation(MyMethodAnnotation .class);

myMethodAnnotation.desc();

5.spring ioc反射机制原理

<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

下面是Spring经过配置进行实例化对象,并放到容器中的伪代码:

//解析<bean .../>元素的id属性获得该字符串值为“courseDao”
String idStr = "courseDao";
//解析<bean .../>元素的class属性获得该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”
String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";
//利用反射知识,经过classStr获取Class类对象
Class<?> cls = Class.forName(classStr);
//实例化对象
Object obj = cls.newInstance();
//container表示Spring容器
container.put(idStr, obj);
 

4、缺点

性能是一个问题,反射至关于一系列解释操做,通知jvm要作的事情,性能比直接的java代码要慢不少。

相关文章
相关标签/搜索