java-初识反射Reflection
简单上代码了解一下:
1.实体类
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
1 package com.reflection; 2 3 public class Student { 4 //学生实体类,包含编号,名字,所属班级的属性 5 private int id; 6 private String name; 7 private String cname; 8 9 public Student() { 10 super(); 11 } 12 //构造器 13 public Student(int id, String name, String cname) { 14 super(); 15 this.id = id; 16 this.name = name; 17 this.cname = cname; 18 } 19 20 public int getId() { 21 return id; 22 } 23 public void setId(int id) { 24 this.id = id; 25 } 26 27 public String getName() { 28 return name; 29 } 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public String getCname() { 35 return cname; 36 } 37 public void setCname(String cname) { 38 this.cname = cname; 39 } 40 41 }
2.反射方法示例:
1 package com.reflection; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.InvocationTargetException; 6 import java.lang.reflect.Method; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 /* 11 * Java动态性之反射机制:reflection 12 * 动态语言: 13 * 程序运行时,可以改变程序结构或变量类型,Java并非动态语言,但其拥有动态性,利用反射机制以及字节码操作获得类似动态语言的特性. 14 * 一.反射机制:可以于运行时加载,探知,使用编译期间完全未知的类。 15 * (1)PS:程序在运行状态中,可以动态的加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性 16 * (2)操作方式:Class c=Class.forName("com.reflection.Reflect"); 17 * (3)反射:加载完类之后,在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象),该对象包含了完整的类的结构信息,通过这个对象可以看到类的结构,这便是反射。 18 * (4)Class类是Reflection的根源:针对任何想要动态加载,运行的类,唯有先获得相应的Class对象。 19 * (5)获取Class对象的三种方式: getClass(),Class.forName(),.class语法 20 * (6)反射机制的常见作用: 21 * 动态加载类,动态获取类的信息(属性,方法,构造器)/动态构造对象/动态调用类和对象的任意方法及构造器/ 22 * 动态调用和处理属性/获取泛型信息/处理注解 23 * 二.动态编译: 24 * 25 * 三.动态执行JavaScript代码: 26 * 27 * 四.动态字节码操作: 28 * 29 * 30 * 31 */ 32 public class Reflect { 33 34 @SuppressWarnings("all") 35 public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { 36 try { 37 38 //获取Student类的Class对象 39 Class c=Class.forName("com.reflection.Student"); 40 //通过该Class对象获取该类的具体名字(包含包名)及类名 41 String realName=c.getName(); 42 String name=c.getSimpleName(); 43 System.out.println(" 具体名字:"+realName+" 类名:"+name); 44 45 //获取类的属性 46 //Field[] field=c.getFields();//只能获取public的属性 47 Field[] fields=c.getDeclaredFields(); 48 //获取所有属性 49 for(Field f:fields) { 50 System.out.println("属性:"+f); 51 } 52 53 /*获取类所有的方法 54 PS:如果方法有参,则必须参数类型对应的Class对象 55 Method m1=c.getDeclaredMethod("getName", null); 56 Method m2=c.getDeclaredMethod("setName", String.class);*/ 57 Method[] methods=c.getMethods(); 58 for(Method m:methods) { 59 System.out.println("方法:"+m); 60 } 61 62 //获取类所有的构造器 63 Constructor[] constructors= c.getConstructors(); 64 for(Constructor con:constructors) { 65 System.out.println("构造器:"+con); 66 } 67 68 //通过反射调用构造方法,构造对象,创建记录并将其放入集合中,然后打印出来 69 Constructor<Student> cr=c.getConstructor(int.class,String.class,String.class); 70 Student s1=cr.newInstance(123,"张三","软件一班"); 71 Student s2=cr.newInstance(456,"李四","软件二班"); 72 List<Student> list=new ArrayList<Student>(); 73 list.add(s1); 74 list.add(s2); 75 System.out.println("编号:"+list.get(0).getId()+" 姓名:"+list.get(0).getName()+" 班级:"+list.get(0).getCname()); 76 System.out.println("编号:"+list.get(1).getId()+" 姓名:"+list.get(1).getName()+" 班级:"+list.get(1).getCname()); 77 78 79 //接下来直接利用对象里面的方法来对 Student实体类进行初始化数据操作 80 Class c2=Class.forName("com.reflection.Student"); 81 Student s3=(Student)c2.newInstance(); 82 //先获取Class对象里面的方法 83 Method m2=c2.getDeclaredMethod("setName", String.class); 84 //使用该方法 85 m2.invoke(s3, "王五"); 86 System.out.println("方法实现后获取值为:"+s3.getName()); 87 88 } catch (ClassNotFoundException e) { 89 90 e.printStackTrace(); 91 } 92 93 } 94 95 }
效果截图:
ps:文章待完善,如存在不正之处欢迎大佬指出。

更多精彩