本文共 6039 字,大约阅读时间需要 20 分钟。
Class clazz = Class.forName("cn.xiyou.Scanner.MyTest");
先创建一个标准的实体类:
public class Student { private String name; private int age; private int id; public Student() { } public Student(String name, int age, int id) { this.name = name; this.age = age; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; }}
反射机制获取相关信息:
public class Test01 { public static void main(String[] args) throws Exception { /** * 对象是表示或封装一些数据。 * 一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会被放到对应的Class对象中去 */ //利用反射获取类的信息(类名、属性、方法、构造器),注意:一个类只有一个Class对象 Class clazz = Class.forName("cn.反射机制.demo01.Student"); /* * 1.获取类的名字 */ String clazzName = clazz.getName();//(包名+类名) System.out.println(clazzName); String clazzSimpleName = clazz.getSimpleName();//类名 System.out.println(clazzSimpleName); System.out.println("----------------这是一个华丽的分割线----------------"); /* * 2.获得属性信息 */ //获取public的属性 Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field); } //获取所有的属性(不论public和private) Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println("属性:"+declaredField); } //获取某个属性(不论public和private) Field name = clazz.getDeclaredField("name"); System.out.println(name); System.out.println("----------------这是一个华丽的分割线----------------"); /* *3.获取方法信息 */ //获得所有public的方法 Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method); } //获取所有的方法(不论public和private) Method[] declaredMethods = clazz.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println("方法:"+declaredMethod); } //获取指定方法,参1:方法名,参2:传递的参数类型的class对象 Method declaredMethod = clazz.getDeclaredMethod("getAge"); System.out.println(declaredMethod); Method declaredMethod1 = clazz.getDeclaredMethod("setAge", int.class); System.out.println(declaredMethod1); System.out.println("----------------这是一个华丽的分割线----------------"); /* *4.获取构造方法信息 */ //获取所有的构造器 Constructor[] constructors = clazz.getDeclaredConstructors(); for (Constructor constructor : constructors) { System.out.println("构造器:"+constructor); } //获取无参构造 Constructor constructor = clazz.getDeclaredConstructor(null); System.out.println("无参构造:"+constructor); //获取有参构造 Constructor constructor1 = clazz.getDeclaredConstructor(String.class,int.class,int.class); System.out.println("有参构造:"+constructor1); }}
/** * 通过反射动态操作:构造器、方法、属性 */public class Test02 { public static void main(String[] args) throws Exception { Class clazz = Class.forName("cn.反射机制.demo01.Student"); /* * 1.通过反射动态操作构造方法,构造对象 */ //通过调用的是无参构造器构造对象 Student student = (Student) clazz.newInstance(); System.out.println(student); //通过调用的是有参构造器构造对象 Constructor c = clazz.getDeclaredConstructor(String.class,int.class,int.class); Student student2 = (Student) c.newInstance("张三", 18, 02165055); System.out.println(student2.getName()+"==="+student2.getAge()+"==="+student2.getId()); /* * 2.通过反射操作方法 */ //通过反射调用方法 Student student3 = (Student) clazz.newInstance(); Method method = clazz.getDeclaredMethod("setName", String.class); method.invoke(student3,"李四"); /* * 3.通过反射操作属性 */ Student student4 = (Student) clazz.newInstance(); Field f = clazz.getDeclaredField("name"); //setAccessible(true)意思是:这个属性关闭安全检查,直接可以访问(就可以访问private的属性了),提高效率 f.setAccessible(true); f.set(student4,"王五");//给student4的name设置值 String sname = (String) f.get(student4);//获取student4的name值 System.out.println(sname); }}
Java中的泛型是在编译器给javac使用的,确保数据的安全性和免掉强制类型转换的麻烦。但是一旦编译完成,所有的泛型都会被擦除。那么Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能被归一到class类中的类型但是又和原始类型齐名的类型。
public class Test03 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException { Class clazz = Class.forName("cn.反射机制.demo01.Student"); //获取这个类的所有注解 Annotation[] annotations = clazz.getDeclaredAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } //获取类指定注解的值 MyTable tb = (MyTable) clazz.getAnnotation(MyTable.class); System.out.println(tb.value()); //获得类的属性的注解 Field f = clazz.getDeclaredField("name"); MyField myField = f.getAnnotation(MyField.class); System.out.println(myField.name()+"--"+myField.type()+"--"+myField.length()); }}
转载地址:http://daiwi.baihongyu.com/