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反射初探的更多相关文章

  1. 【java】java反射初探 ——“当类也照起镜子”

    反射的作用   开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类   我理解的“反射”的意义 (仅个人理解) 我理解的java反射机制就是: 提供一套完善而强大的API ...

  2. 【java】java反射初探 ——“当类也学会照镜子”

    反射的作用   开门见山地说说反射的作用   1.为我们提供了全面的分析类信息的能力 2.动态加载类   我理解的“反射”的意义 (仅个人理解哈)   我理解的java反射机制就是: 提供一套完善而强 ...

  3. Java反射初探 ——“当类也学会照镜子”

    反射的作用 开门见山地说说反射的作用   1.为我们提供了全面的分析类信息的能力 2.动态加载类   我理解的“反射”的意义 (仅个人理解哈)   我理解的java反射机制就是: 提供一套完善而强大的 ...

  4. 初探Java反射机制

    反射库提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序库.这项功能被大量地应用于JavaBeans中.反射机制提供了在运行状态中获得和调用修改任何一个类的属性和方法的能力. ...

  5. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

  6. 浅谈java反射机制

    目录 什么是反射 初探 初始化 类 构造函数 属性 方法 总结 思考 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意 ...

  7. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  8. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  9. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

随机推荐

  1. python中getpass模块

    1 import getpass 2 name = input('请输入你的名字:') 3 passwd = getpass.getpass('请输入你的密码:') 4 print(name) 5 p ...

  2. 【Android】数据存储和访问

    一.SharedPreferences 2.SQLite

  3. 「JSOI2013」哈利波特和死亡圣器

    「JSOI2013」哈利波特和死亡圣器 传送门 首先二分,这没什么好说的. 然后就成了一个恒成立问题,就是说我们需要满足最坏情况下的需求. 那么显然在最坏情况下伏地魔是不会走回头路的 因为这显然是白给 ...

  4. Linux - Shell后台、前台,运行命令

    后台运行(终端能操纵) 只需要在后面加& gedit & 查看正在运行的jobs jobs 放到前台运行(终端不能操作) fg % fg %1 一个终端一个context.一个终端就是 ...

  5. iOS-动态库创建(详解)

    https://blog.csdn.net/LisztCoder/article/details/78132147 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  6. Bugku-CTF社工篇之简单的社工尝试

  7. scala基础API

    1.对象和json转换 1.1 json取值 val json:JSONObject = JSON.parseObject(jsonMsg:String)val message:String = js ...

  8. fastJson javaBean和JSON对象相互转换

    fastjson的作用就是把java 对象转化为字符串,把字符串转化为java对象,然后方便进行后续的逻辑处理. java对象和json互相转换都是通过JSON对象操作的: JavaBean bean ...

  9. c++ 读取、输出txt文件

    下面这段话转自:https://blog.csdn.net/lightlater/article/details/6326338 关于文本文件的文件头 第一 ANSI文件的文件头为空,不需要处理: 第 ...

  10. Jquery 动态交换两个div位置并添加Css动画效果

    前端网页开发中我们经常会遇到需要动态置换两个DIV元素的位置,常见的思路大多是不考虑原始位置,直接采用append或者appendTo方式将两元素进行添加,该法未考虑原始位置,仅会添加为元素的最后一子 ...