反射创建对象以及方法的使用
反射创建对象以及方法的使用
反射获取构造器
import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) {
try {
Class clazz = Class.forName("com.geek.pritice.Father");
/*
//通过Father类的class对象来获取其无参构造,然后强转为Father类型,就相当于无参构造Father对象,高级版本已被弃用,不推荐使用
Father father = (Father)clazz.newInstance();
father.doIt();
*/
//先获取构造器(分别是无参构造和单参构造)
Constructor constructor = clazz.getConstructor();
Constructor constructor1 = clazz.getDeclaredConstructor(int.class);
//然后用构造器调用newInstance方法,强转为Father类型,如果是有参构造那么参数要写入相应的值
Father father = (Father) constructor.newInstance();
constructor1.setAccessible(true);
Father father1 = (Father) constructor1.newInstance(20);
System.out.println(father.a);
System.out.println(father1.a);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Father{
public int a = 10;
private String b = "字符串";
boolean c = true;
protected double d = 10.2;
public Father() {
}
private Father(int a) {
this.a = a;
}
private int getA(){
return this.a;
}
public void doIt(){
System.out.println("这是doIt方法");
}
}
以上有一点要注意,我们可以通过getDeclaredConstructor()去获得private构造器,但是无法去使用其创建对象,我成功创建对象的原因用了权限检测关闭方法 constructor1.setAccessible(true); 当参数为true时,对应的属性或者方法权限检测关闭
反射获取方法的使用
方法名.invoke(对象, 参数值)
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class clazz = Class.forName("com.geek.pritice.Father");
//反射创建对象
Father father = (Father)clazz.getConstructor().newInstance();
//获取returnThis方法
Method returnThis = clazz.getDeclaredMethod("returnThis", String.class);
//执行方法 方法名.invoke(对象, 参数值)
returnThis.invoke(father,"这句话应该返回");
//获取getA方法
Method getA = clazz.getDeclaredMethod("getA");
//让private的私有方法权限检测关闭
getA.setAccessible(true);
//执行方法 方法名.invoke(对象, 参数值)
getA.invoke(father);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Father{
public int a = 10;
private String b = "字符串";
boolean c = true;
protected double d = 10.2;
public Father() {
}
private Father(int a) {
this.a = a;
}
private int getA(){
System.out.println(this.a);
return this.a;
}
public void doIt(){
System.out.println("这是doIt方法");
}
public void returnThis(String s){
System.out.println(s);
}
}
反射获取属性
通过反射获取的属性是从class对象中取出来的属性,都是默认值,我们要对具体对象进行操作时应该在参数里加上对象,属性和方法均是如此
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
try {
Class clazz = Class.forName("com.geek.pritice.Father");
//反射创建对象
Father father = (Father)clazz.getConstructor().newInstance();
//获取abcd属性
Field a = clazz.getDeclaredField("a");
Field b = clazz.getDeclaredField("b");
Field c = clazz.getDeclaredField("c");
Field d = clazz.getDeclaredField("d");
//abcd设置
a.set(father,20);
b.setAccessible(true);
b.set(father,"666");
c.set(father,false);
d.set(father,10.2);
//输出属性对应的值 属性.get(对象)
System.out.println(a.get(father));
System.out.println(b.get(father));
System.out.println(c.get(father));
System.out.println(d.get(father));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Father{
public int a = 10;
private String b = "字符串";
boolean c = true;
protected double d = 10.2;
public Father() {
}
private Father(int a) {
this.a = a;
}
private int getA(){
System.out.println(this.a);
return this.a;
}
public void doIt(){
System.out.println("这是doIt方法");
}
public void returnThis(String s){
System.out.println(s);
}
private void setB(String s){
this.b = s;
}
}

浙公网安备 33010602011771号