文档章节

java的反射机制理解

 盼望明天
发布于 07/20 11:05
字数 562
阅读 7
收藏 0

一、概念说明

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

二、反射相关类

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

三、应用场景

1.获取对象及成员变量

package com.reflect.dto

public class RequestDTO{

private String userId;

private String userName;

}

调用:

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);
 

四、缺点

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

 

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 4
博文 84
码字总数 127469
作品 0
广州
最最最常见的Java面试题总结——第二周

String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? String和StringBuffer、StringBuilder的区别 可变性   String类中使用字符数组:保存字符串,所以String对象是...

Amsour丶
前天
0
0
阿里高级Java面试题(首发,70道,带详细答案)

整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害。下面题目都带超详细的解答,详情见底部。 1、java事件机制包括哪三个部分?分别介绍。 2、为什么要使用线程池? 3、线程池有什...

java技术栈
2017/11/11
0
0
Android 4.4(KK)中利用APP打开关闭数据流量

在Android 4.4中,在app中打开或关闭数据流量 如果有这方面需求可以参考。 思路 利用JAVA的反射机制(Reflection),来调用CONNECTIVITY_SERVICE完成相关操作。 关于JAVA的反射机制,可以参考...

W_X
2014/12/17
0
4
跳槽时,这些Java面试题99%会被问到

我在 Oracle 已经工作了近 7 年,面试过从初级到非常资深的Java工程师,且由于 Java 组工作任务的特点,我非常注重面试者的计算机科学基础和编程语言的理解深度,可以不要求面试者非要精通 ...

Java小铺
今天
0
0
一个例子让你了解Java反射机制

Java反射机制: 通俗地说,反射机制就是可以把一个类、类的成员(函数、属性),当成一个对象来操作,希望读者能理解,也就是说,类、类的成员,我们在运行的时候还可以动态地去操作他们. 理论...

张超
2014/01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Zookeeper总结

Zookeeper的部分概念 什么是zookeeeper? Zookeeper是一个分布式服务的协调中心 zookeeper节点的角色类型? Leader(领导者)、Follower(跟随者)、Observer(观察者) Leader 负责更新系统...

DemonsI
11分钟前
0
0
Redis学习笔记

常用命令 从Docker进入Redis的命令 sudo docker exec -it redis /bin/bash

OSC_fly
11分钟前
0
0
SqlServer查询某个日期的数据

select * from View_ZJMONITORINGCORROSION where ENTERDATE > CONVERT(datetime,DATEADD(day,1,'2017/12/28 14:53:07'))...

笑丶笑
13分钟前
0
0
常用编码规范

Standard characters https://ascii.cl/

yeahlife
14分钟前
0
0
flannel实战

docker swarm mode的出现是个里程碑,官方原生的编排调度看起来都成雏形了,但是swarm mode和容器外部系统的对接、网络性能始终不尽人意,swarm mode下各种开源周边不能使用,感觉swarm mod...

China_OS
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部