反射
- 将类的各个组成部分封装为其他对象,反射机制
获取Class对象的方式
- Class.forName(“全路径”); 将字节码文件加载进内存,返回class对象
- 类名.class; 通过类名的属性class获取
- 对象.getClass(); 该方法定义于Object类中
Book类
package com.study.domain;
public class Book {
public String a;
protected String b;
String c;
private String name;
private String number;
public Book(String name, String number) {
this.name = name;
this.number = number;
}
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
测试类
package com.study.Reflect;
import com.study.domain.Book;
public class Reflect {
public static void main(String[] args) throws Exception{
Class cla1 = Class.forName("com.study.domain.Book");
System.out.println(cla1);
Class<Book> cla2 = Book.class;
System.out.println(cla2);
Book book = new Book();
Class cla3 = book.getClass();
System.out.println(cla3);
System.out.println(cla1 == cla2);
System.out.println(cla1 == cla3);
}
}
运行结果
class com.study.domain.Book
class com.study.domain.Book
class com.study.domain.Book
true
true
Class对象功能
获取成员变量
Field[] fields = cla1.getFields();
获取public修饰的所有成员变量Field a = cla1.getField("a");
获取指定名字的成员变量(public修饰的)Field[] declaredFields = cla1.getDeclaredFields();
获取所有的成员变量Field a1 = cla1.getDeclaredField("a");
指定名字的 所有的成员变量都可以访问
测试方法
Class cla1 = Class.forName("com.study.domain.Book");
Field[] fields = cla1.getFields();
Field a = cla1.getField("a");
Field[] declaredFields = cla1.getDeclaredFields();
Field a1 = cla1.getDeclaredField("b");
System.out.println(a1);
//设置private修饰的成员变量可修改
a1.setAccessible(true);
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
for (Field field : fields) {
System.out.println(field);
}
System.out.println(a);
打印结果为
protected java.lang.String com.study.domain.Book.b
public java.lang.String com.study.domain.Book.a
protected java.lang.String com.study.domain.Book.b
java.lang.String com.study.domain.Book.c
private java.lang.String com.study.domain.Book.name
private java.lang.String com.study.domain.Book.number
public java.lang.String com.study.domain.Book.a
public java.lang.String com.study.domain.Book.a
获取构造器
- 同Field 四种获取方式
测试类
Class cla1 = Class.forName("com.study.domain.Book");
Constructor constructor = cla1.getConstructor(String.class,String.class);
System.out.println(constructor);
打印
public com.study.domain.Book(java.lang.String,java.lang.String)
获取对象
- 同上 四种获取方式
Class cla1 = Class.forName("com.study.domain.Book");
Method[] methods = cla1.getMethods();
Book book = new Book();
//执行该方法
getName.invoke(book);
Method getName = cla1.getMethod("getName");
System.out.println(getName);
for (Method method : methods) {
System.out.println(method);
}
打印结果 同时打印了Object类中的方法
public java.lang.String com.study.domain.Book.getName()
public java.lang.String com.study.domain.Book.getNumber()
public java.lang.String com.study.domain.Book.getName()
public void com.study.domain.Book.setName(java.lang.String)
public void com.study.domain.Book.setNumber(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()