java反射初探
java反射
反射是java的重要特性之一,java.lang.reflect 是jdk支持反射的重要包,我下面可能会对构造器Constructor,属性Filed,方法Method会用到。反射其实很常见,在java源码、spring就有很多运用,Spring AOP就应用到了反射。设计模式中代理模式就可以用java反射实现。

反射的例子
创建一个Bean
package com.java.javabase.reflect;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
/**
* @author
*/
@Slf4j
@Data
//@AllArgsConstructor
@ToString
@NoArgsConstructor
public class Book {
private final String tag="tag";
private String auther;
private String name;
private Book(String auther, String name) {
this.auther = auther;
this.name = name;
}
private void printAlarm(String args){
log.info("alarm occured! "+args);
}
}
创建测试程序
从获取Class、创建Book的对象Obect、构造器、私有属性(Field)、私有方法(Method)四个维度测试
package com.java.javabase.reflect;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author
*/
@Slf4j
public class BookReflectTest {
//创建对象测试
public static void reflectNewInstance() {
try {
Class bookClass = Class.forName("com.java.javabase.reflect.Book");
//需要一个无参构造器,否则会报错:Caused by: java.lang.NoSuchMethodException: com.java.javabase.reflect.Book.<init>()
Book bookObject = (Book) bookClass.newInstance();
bookObject.setName("English");
bookObject.setAuther("jack");
log.info("NewInstance test :{}", bookObject.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static void reflcectConstructor() {
Class bookClass = null;
try {
bookClass = Class.forName("com.java.javabase.reflect.Book");
//共有的构造器用getConstructor和getDeclaredConstructor不需要constructor.setAccessible(true);
//私有的构造器constructor.setAccessible(true);
//Constructor constructor = bookClass.getConstructor(String.class, String.class);
Constructor constructor = bookClass.getDeclaredConstructor(String.class, String.class);
constructor.setAccessible(true);
Book bookObject = (Book) constructor.newInstance("jack2", "English 2");
log.info("Constructor test :{}", bookObject.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void reflectfield() {
Class bookClass = null;
try {
bookClass = Class.forName("com.java.javabase.reflect.Book");
// Book bookObject = null;
// bookObject = (Book) bookClass.newInstance();
Book bookObject = new Book();
Field field = bookClass.getDeclaredField("tag");
Field nameField = bookClass.getDeclaredField("name");
field.setAccessible(true);
nameField.setAccessible(true);
bookObject.setName("English3");
bookObject.setAuther("jack3");
//public Object get(Object obj)
Object object = field.get(bookObject);
Object nameObject = nameField.get(bookObject);
log.info("reflectfield tag :{}", object);
log.info("reflectfield name :{}", nameObject);
log.info("reflectfield test :{}", bookObject.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// catch (InstantiationException e) {
// e.printStackTrace();
// }
}
public static void reflectMethod() {
Class bookClass = Book.class;
// Book bookObject = null;
// bookObject = (Book) bookClass.newInstance();
Book bookObject = null;
try {
bookObject = (Book) bookClass.newInstance();
//public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method method = bookClass.getDeclaredMethod("printAlarm",String.class);
method.setAccessible(true);
try {
//public Object invoke(Object obj, Object... args)
method.invoke(bookObject,"end");
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
reflectNewInstance();
reflcectConstructor();
reflectfield();
reflectMethod();
}
}
结果
2019-08-26 18:54:34,573 [main] INFO BookReflectTest - NewInstance test :Book(tag=tag, auther=jack, name=English)
2019-08-26 18:54:34,588 [main] INFO BookReflectTest - Constructor test :Book(tag=tag, auther=jack2, name=English 2)
2019-08-26 18:54:34,588 [main] INFO BookReflectTest - reflectfield tag :tag
2019-08-26 18:54:34,588 [main] INFO BookReflectTest - reflectfield name :English3
2019-08-26 18:54:34,588 [main] INFO BookReflectTest - reflectfield test :Book(tag=tag, auther=jack3, name=English3)
2019-08-26 18:54:34,588 [main] INFO Book - alarm occured! end
java反射初探的更多相关文章
- 【java】java反射初探 ——“当类也照起镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解) 我理解的java反射机制就是: 提供一套完善而强大的API ...
- 【java】java反射初探 ——“当类也学会照镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制就是: 提供一套完善而强 ...
- Java反射初探 ——“当类也学会照镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制就是: 提供一套完善而强大的 ...
- 初探Java反射机制
反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序库.这项功能被大量地应用于JavaBeans中.反射机制提供了在运行状态中获得和调用修改任何一个类的属性和方法的能力. ...
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- 浅谈java反射机制
目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
随机推荐
- cookie按钮点击倒计时
<!--引入jquery.cookie.js 插件--> <script src="js/jquery.js" type="text/javascrip ...
- Update(Stage5):DMP项目_业务介绍_框架搭建
DMP (Data Management Platform) 导读 整个课程的内容大致分为如下两个部分 业务介绍 技术实现 对于业务介绍, 比较困难的是理解广告交易过程中各个参与者是干什么的 对于技术 ...
- 【Fine学习笔记】Jmeter笔记
熟悉几个专有名词: 1.测试计划是顺序执行的,一个性能测试必须有的三部分:测试计划.线程组.sampler(采样器)--核心 2.控制器(用来定义请求执行的):loop if else 3.timer ...
- 「CQOI2016」不同的最小割
「CQOI2016」不同的最小割 传送门 建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了. 参考代码: #include <algorithm> ...
- js 常用字符正则匹配
写代码时需要js验证密码,百度到的验证方法,图方便保存收藏,如感兴趣请移步原博主博文!http://blog.csdn.net/x_i_y_u_e/article/details/47730135 1 ...
- springboot devtool热部署的一个大坑
spring.devtools.restart.poll-interval=3000ms spring.devtools.restart.quiet-period=2999ms 别问我为什么,问就是一 ...
- unique() 函数详解
简介 顾名思义,unique,独一无二的.这个函数可以对容器中的元素进行"去重". 但是需要注意,这里的"去重",并没有把重复的元素删除,只是不重复的元素放到了 ...
- PageObject
import org.openqa.selenium.WebDriver; import org.openqa.selenium.ie.InternetExplorerDriver; import o ...
- 开启Linux服务器vnc远程服务详细步骤
1.安装rpm包 ,如果没有这个包,请提前下载好,然后输入命令安装 yum localinstall /usr/local/tigervnc-server-1.1.0-24.el6.x86_64 ...
- LDAP-轻量级目录访问协议(统一认证)
概念 LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP. 参考资料 LDAP概念和原理介绍 我花了一个五一终于搞懂 ...