Java 反射
2018-07-20 18:34
176 查看
反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。
测试类代码如下:
输出如下:
不难看出,获得的 是 同一个 字节码对象。
输出如下:
输出如下:
测试类代码如下:
class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Person() {} public Person(String name) { this.name = name; } }
构造方法Constructor
import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTest { @Test public void demo1() throws Exception { String className = "Person"; Class clazz = Class.forName(className); //获得字节码对象 Constructor[] constructors = clazz.getConstructors(); System.out.println(constructors.length); Object o1 = clazz.getConstructor().newInstance(); Person p1 = new Person(); System.out.println(o1.getClass() == p1.getClass()); Object o2 = clazz.getConstructor(String.class).newInstance("sketch"); Person p2 = new Person("sketch"); System.out.println(o2.getClass() == p2.getClass()); System.out.println(o1.getClass() == o2.getClass()); } }
输出如下:
2 true true true
不难看出,获得的 是 同一个 字节码对象。
成员变量Field
@Test public void demo2() throws Exception{ Person p = new Person("sketch"); String className = "Person"; Class clazz = Class.forName(className); //获得字节码对象 Field[] fields = clazz.getDeclaredFields(); System.out.println(fields.length); Field name = clazz.getDeclaredField("name"); name.setAccessible(true); Object value = name.get(p); //p.getName() System.out.println(value); name.set(p, "Tara"); //p.setName("Tara") System.out.println(name.get(p)); }
输出如下:
1 sketch Tara
方法Method
@Test public void demo3() throws Exception { Person p = new Person(); String className = "Person"; Class clazz = Class.forName(className); //获得字节码对象 Method setName = clazz.getDeclaredMethod("setName", String.class); //如果执行静态方法,第一个参数obj传入null setName.invoke(p, "sketch"); //p.setName("sketch") Method getName = clazz.getDeclaredMethod("getName", null); //如果执行静态方法,第一个参数obj传入null Object name = getName.invoke(p, null); //p.getName() System.out.println(name); }
输出如下:
sketch
相关文章推荐
- java中通过反射得到StatusBarManager
- java 反射例子汇总
- java反射详解
- JAVA -- 反射机制与系统耦合
- 为什么Java反射对象必须有一个无参数的构造方法?
- Java Reflection (JAVA反射)
- 黑马程序员——Java之反射
- Java 利用反射、泛型实现dao层的增删改查
- 黑马程序员_java05_反射
- Java反射中的setAccessible()方法是否破坏了类的访问规则
- java 反射api的功能详解
- Java反射相关(一)
- java反射示例
- java-反射示例
- JAVA 反射
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程.]
- java之反射技术及其应用
- Java系列笔记(2) - Java RTTI和反射机制
- java中数组的反射
- java高新技术之反射