反射
若编译时已经知道了类或对象的具体信息,那么直接对类和对象进行操作即可,不需要使用反射。
若编译时不知道类或对象的具体信息,运行的时候才知道,这种情况就不知道要new哪个类具体执行哪些操作,此时需要反射。
作用:在不能用new等一些基础操作时可以利用反射来进行创建对象、操作属性、执行方法。
优点:
-
编译时不知道类或者对象的具体信息,运行时才知道,创建对象无法使用new方法,但是反射可以完成对象创建。
-
可以突破封装性的限制,即使是private的成员也可以进行访问。
缺点:
-
代码繁琐,可读性差,速度较慢。
-
打破了封装性,可能有安全隐患。
使用反射创造对象
//需要创建对象的类
package com.meng.reflection;
public class Reflection {
public Reflection() {
System.out.println("公有构造函数");
}
private Reflection(String name){
System.out.println("私有构造函数");
}
public int nameid;
public String name;
private int id;
public int getNameid() {
return nameid;
}
public String getName() {
return name;
}
public void setNameid(int nameid) {
this.nameid = nameid;
}
public void setName(String name) {
this.name = name;
}
public void met1(){
System.out.println("无参数方法");
}
public int met2(int a, int b){
return a + b;
}
private int met3(int a,int b){
return a - b;
}
}
package com.meng.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class RefCons {
public static void main(String[] args) throws Exception{
//通过反射进行公有构造函数的调用创建对象
Class aClass = Class.forName("com.meng.reflection.Reflection");
Constructor constructor = aClass.getConstructor();
Object o = constructor.newInstance();
//通过反射进行私有构造函数的调用创建对象
Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);//获得私有构造函数的结构,仅这一部只是获得结构并不能进行调用
declaredConstructor.setAccessible(true);//调用私有构造函数
Object xiaoming = declaredConstructor.newInstance("xiaoming");
//通过反射调用无参方法
Method met1 = aClass.getMethod("met1");
met1.invoke(xiaoming);
//通过反射调用有参方法
Method met2 = aClass.getMethod("met2", int.class, int.class);
Object sum = met2.invoke(xiaoming,10,20);
System.out.println(sum);
//通过反射调用私有方法
Method met3 = aClass.getDeclaredMethod("met3", int.class, int.class);
met3.setAccessible(true);
Object invoke = met3.invoke(xiaoming, 10, 5);
System.out.println(invoke);
}
}