参考文章:https://blog.csdn.net/ljphhj/article/details/12858767
1.类的反射:JAVA反射是程序在运行中,对于任何一个类都可以获得他的所有属性和方法,对于任何一个对象都能调用它的构造方法,属性以及方法,这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。
2.使用场景:当程序在编译时不知道具体的类型,为Object,但是在运行时有需要传入该类型,在编译时无法准确的知道该对象可能属于哪些类,只能依靠运行时信息来发现该对象,这时就必须使用反射己机制来解决这个问题。
3.下面是对类的反射写的一个简单的demo:
public class TestClass {
//这儿当要多次使用Person实例时,将不会多次使用forName方法,
//因为forName太耗时,这样能提高效率
private Class<?> getClassNameCache() {
Person person = new Person();
Class<?> class1 = null;
try {
if (class1 == null) {
class1 = Class.forName("Person");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return class1;
}
public void getClassDemo() throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
//通过反射获得类名
System.out.println(getClassNameCache().getName());
//通过反射创建对象
Person getInstance = (Person) getClassNameCache().newInstance();
getInstance.setName("wdd");
System.out.println(getInstance.getName());
//通过Java反射机制得到一个类的构造函数,并实现创建带参实例对象
Constructor<?>[] constructors = getClassNameCache().getConstructors();
try {
//这儿构造方法的顺序要和Person构造方法顺序要一致,不然会报出错误:
//at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
//所以下列是第一个为无参构造方法,第二个才是有参构造方法
Person person2 = (Person) constructors[0].newInstance();
person2.setName("sdw");
person2.setAge(30);
Person person3 = (Person) constructors[1].newInstance("wdd",28);
System.out.println(person3.toString());
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException {
TestClass testClass = new TestClass();
testClass.getClassDemo();
}
}
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name,int age) {
this.name = name;
this.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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
运行结果:
Person
wdd
Person [name=wdd, age=28]
4.反射的效率问题:
尽量不要getMethods()
后再遍历筛选,而直接用getMethod(methodName)
来根据方法名获取方法;