Java反射机制-学习笔记1
3140 点击·0 回帖
![]() | ![]() | |
![]() | java 中,定义一个Class,然后就可以通过new 关键字,将Class 实例化,从而得到一个实例对象; 那么反射,刚好相反,是通过一个Class的实例对象,来得到Class 类的相关信息. 实例1: 通过一个实例对象,获得完整的包名和类名 [java] package org.zhang.test; class Demo{ } public class ReflectTest { public static void main(String[] args) { Demo demo = new Demo(); System.out.println(demo.getClass().getName()); } } 运行结果:org.zhang.test.Demo 实例2:所有类的对象都是Class 的实例 [java] package org.zhang.test; class Demo { } public class ReflectTest { public static void main(String[] args){ Class<?> c1 = null; Class<?> c2 = null; Class<?> c3 = null; try { c1 = Class.forName("org.zhang.test.Demo"); } catch (ClassNotFoundException e) { e.printStackTrace(); } c2 = (new Demo()).getClass(); c3 = Demo.class; assert c1 != null; System.out.println(c1.getName()); System.out.println(c2.getName()); System.out.println(c3.getName()); } } 结果: org.zhang.test.Demo org.zhang.test.Demo org.zhang.test.Demo 其中:Class<?> 等同于 Class。 定义泛型的时候,如:class User<T> { } 实例3: 通过Class,实例化 类的对象 [java] package org.zhang.test; class Person{ private String name; private int age; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } 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 class ReflectTest { public static void main(String[] args){ Class<?> personClass = null; Person person = null; try { personClass = Class.forName("org.zhang.test.Person"); person = (Person) personClass.newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (InstantiationException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IllegalAccessException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } assert person != null; person.setName("zhangwenan"); person.setAge(25); System.out.println(person); } } 结果: Person{name='zhangwenan', age=25} 实例4:通过Class 调用不同的构造方法 [java] package org.zhang.test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; class Person{ private String name = "no name"; private int age = 0; public Person(String name) { this.name = name; } public Person(int age) { this.age = age; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } 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 class ReflectTest { public static void main(String[] args){ Class<?> personClass = null; Person person1 = null; Person person2 = null; Person person3 = null; Person person4 = null; Constructor constructors[] = new Constructor[4]; try { personClass = Class.forName("org.zhang.test.Person"); } catch (ClassNotFoundException e) { System.out.println("没有找到Person 类"); e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } if (personClass != null) { try { constructors[0] = personClass.getConstructor(); constructors[1] = personClass.getConstructor(String.class); constructors[2] = personClass.getConstructor(int.class); constructors[3] = personClass.getConstructor(String.class, int.class); person1 = (Person) constructors[0].newInstance(); person2 = (Person) constructors[1].newInstance("shiwoo"); person3 = (Person) constructors[2].newInstance(25); person4 = (Person) constructors[3].newInstance("shiwoo", 25); System.out.println(person1); System.out.println(person2); System.out.println(person3); System.out.println(person4); } catch (NoSuchMethodException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (InstantiationException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (IllegalAccessException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (InvocationTargetException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } } 结果: Person{name='no name', age=0} Person{name='shiwoo', age=0} Person{name='no name', age=25} Person{name='shiwoo', age=25} 实例5:获取某个类所实现的所有接口 [java] package org.zhang.test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; interface Chiness{ void say(); } class Person implements Chiness{ @Override public void say() { System.out.println("我是中国人"); } } public class ReflectTest { public static void main(String[] args){ Class<?> personClass = null; Class<?>[] interfaces = null; try { personClass = Class.forName("org.zhang.test.Person"); interfaces = personClass.getInterfaces(); for (Class<?> c : interfaces){ System.out.println(c.getName()); } } catch (ClassNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } 结果: org.zhang.test.Chiness 实例6:获取父类 [java] public class ReflectTest { public static void main(String[] args){ Class<?> personClass = null; Class<?> superClass = null; try { personClass = Class.forName("org.zhang.test.Person"); superClass = personClass.getSuperclass(); System.out.println(superClass.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } 结果: java.lang.Object 实例7:获取修饰符、方法、返回类型等 [java] package org.zhang.test; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; interface Chiness{ void say(); } class Person implements Chiness{ public Person(){ } @Override public void say() { System.out.println("我是中国人"); } } public class ReflectTest { public static void main(String[] args){ Class<?> personClass = null; Constructor constructor = null; Constructor constructor2 = null; try { personClass = Class.forName("org.zhang.test.Person"); constructor = personClass.getDeclaredConstructor(); constructor2 = personClass.getConstructor(); System.out.println(constructor); System.out.println(constructor2); int modifier = constructor.getModifiers(); System.out.println("int modifier is: " + modifier); System.out.println("string modifier is: " + Modifier.toString(modifier)); Method method = personClass.getMethod("say"); int methodModifier = method.getModifiers(); System.out.println(methodModifier); System.out.println(Modifier.toString(methodModifier)); System.out.println(method.getReturnType()); } catch (ClassNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (NoSuchMethodException e){ e.printStackTrace(); } } } 摘自 小长弓 | |
![]() | ![]() |