第十八章: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); } }