第十八章:Java Reflection
1. JAVA反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
1.1Java反射机制的好处:
Java反射机制通过new来实例化对象只需要(包.类),这样使得反射机制灵活性更高。
第一:获取Class对象属性
package com.reflection.calss;
public class Book {
private String name;
private int no;
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
测试类:
package com.reflection.calss;
/*
* 第一: 反射 Class 对象的机制与实现:
* */
public class Test {
public static void main(String[] args) {
Class dom1 = null;
Class dom2 = null;
Class dom3 = null;
try {
//第一种:最重要
dom1 = Class.forName("com.reflection.calss.Book");
System.out.println("第一种:"+ dom1);
//第二种
Book book = new Book();
//Object bk = book.getClass();
Class> bk = book.getClass();
System.out.println("第二种:"+ bk);
//第三种
dom3 = Book.class;
System.out.println("第三种:"+ dom3);
//先获取class对象 再获取实例化对象
Book book3 = (Book) dom3.newInstance();
System.out.println("实例化对象和内存地址:"+ book3);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.reflection.method;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MethodDom {
//获取方法名
public void MethodTest(Object ob){
Class cl = ob.getClass();
Method[] me = cl.getDeclaredMethods();
for(Method mm : me){
System.out.println("方法名称:" + mm.getName() );
System.out.println("修饰符:" + mm.getModifiers() );
System.out.println("" + mm.getReturnType() + " \n ");
}
}
//获取实例化方法
public void showuser(Object ob){
try {
//方法名 无参数
Class cl = ob.getClass();
Method me= cl.getMethod("getName", null);
me.invoke(ob, new Object[0]);
//方法名 一参数
Method ms = cl.getMethod("setName", String.class);
ms.invoke(ob, "set 调用");
//方法名 多参数
Class[] cll = {String.class, int.class};
Method m1 = cl.getMethod("Test", cll);
Object[] boj = {"哈哈哈",123};
m1.invoke(ob, boj);
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试类:
package com.reflection.method;
import com.reflection.field.Book;
public class TestMethod {
public static void main(String[] args) {
Book ob = new Book();
ob.setName("跑男第十八季");
ob.setType("娱乐");
ob.setNo(90);
MethodDom te = new MethodDom();
//te.MethodTest(ob);
te.showuser(ob);
System.out.println(ob.getName());
System.out.println(ob.getName());
}
}
package com.reflection.field;
import java.lang.reflect.Field;
public class ShowField {
//第一种:方法 接收传递过来的class对象
public void show(Class c){
//getFields只能获取共有属性 getDeclaredFields可以获取私有属性
Field[] fi = c.getDeclaredFields();
for(Field ff : fi){
System.out.println(ff.getName());
System.out.println(ff.getType());
}
}
//第二种: 接收传递过来的实体类对象 对象的属性 和 值
public void obshow(Object ob){
Class cs = ob.getClass();
Field[] fo = cs.getDeclaredFields();
for(Field e : fo ){
try {
//私有属性可见
e.setAccessible(true);
System.out.println("名:"+e.getName()+ " " + "值:"+e.get(ob));
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
}
}
}
测试类:
package com.reflection.field;
public class Test {
public static void main(String[] args) {
Book bo = new Book();
bo.setNo(1);
bo.setName("斗破苍穹");
bo.setType("玄幻");
ShowField ft = new ShowField();
ft.show(Book.class);
ft.obshow(bo);
}
}