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. PB调用.NET类库详解

    要维护一个老的PB系统,有些地方用PB实在不方便,好在就张三.李四几个人用,每人装个.net框架. 设置.NET类COM可见 方式一:将整个程序集设成COM可见 方式二,只公开部分类 使用.Net框架 ...

  2. js中this,箭头函数和普通函数

    四种基本用法 1. 一般方法中,this代指全局对象 window 2. 作为对象方法调用,this代指当前对象 3. 作为构造函数调用,this 指代new 出的对象 function test() ...

  3. 如何使用canvas绘制椭圆,扩展非chrome浏览器中的ellipse方法

    这篇博文主要针对浏览器中绘制椭圆的方法扩展.在网上搜索了很多,发现他们绘制椭圆的方式都有缺陷.其中有压缩法,计算法,贝塞尔曲线法等多种方式.但是都不能很好的绘制出椭圆.所有我就对这个绘制椭圆的方式进行 ...

  4. chkconfig 原理 (企业应用)

    企业应用:如何让某个服务开机自启动 chkconfig --level 345 serviceName on chkconfig --level 345 serviceName off chkconf ...

  5. 【代码总结】SQL语句设计

    1.根据空值(NULL)检索条件 select * from user where age is not null; //查询年龄为null的所有用户 2.使用IN进行范围对比查询 ,5的所有用户 , ...

  6. 寒假pta二

    整除光棍 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整除. 现在 ...

  7. Java 获取年份的第一天或最后一天 工具类

    package com.taiping.test; import java.text.SimpleDateFormat; import java.util.Calendar; import java. ...

  8. vue 使用心得---工作中一些关键点

    1.自定义组件 使用 v-for 循环,最好另外多加上 v-bind:key="items_name",这是特殊用的:key,而不是普通的 :属性 例:<Uiroom> ...

  9. FTP 上传下载 进度条

    11 /// <summary> /// 文件上传 /// </summary> /// <param name="filePath">原路径( ...

  10. 【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)

    题意: 输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出. ...