对比new对象和反射创建对象实例
程序员文章站
2022-03-26 22:21:42
/** * 本实例意在对比以下两种方法创建对象实例: * 直接new对象 * 反射 *直接new对象:无法访问SCP类中的私有方法,仅能访问公有方法 *反射:可访问private,default,protected,public任意方法 *为清楚显示,用反射访问静态和非静态分成两个页面 */ //创建一个SCP类public class SCP { private String name; public int id; private Stri...
/**
* 本实例意在对比以下两种方法创建对象实例:
* 直接new对象
* 反射
* 直接new对象:无法访问SCP类中的私有方法,仅能访问公有方法
* 反射:可访问private,default,protected,public任意方法
* 为清楚显示,用反射访问静态和非静态分成两个页面
*/
//创建一个SCP类
public class SCP {
private String name;
public int id;
private String level;
private static String gender;//静态属性
public SCP() {
}
public SCP(String name, int id, String level) {
this.name = name;
this.id = id;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public static String getGender() {
return gender;
}
public static void setGender(String gender) {
SCP.gender = gender;
}
@Override
public String toString() {
return "SCP{" +
"name='" + name + '\'' +
", id=" + id +
", level='" + level + '\'' +
'}';
}
//自定义方法
private String description (String des){
System.out.println("表现出极高的" + des);
return des;
}
//自定义静态方法
private static void show(){
System.out.println("SCP-682处决实验");
}
}
/**
* @author Prannt
* 正常访问 SCP 类是这样的步骤,先 new对象(静态属性直接调用),再得到对象。
* (包括静态属性和非静态属性,由于自定义方法show()已用private修饰,new对象访问不到)
*/
public class TestCommon {
public static void main(String[] args) {
SCP scp1 = new SCP();
scp1.setId(682);
scp1.setName("不灭孽蜥");
scp1.setLevel("Keter");
SCP.setGender("未知");
System.out.println("项目编号:" + "SCP-" + scp1.getId() + "," + scp1.getName()+ "。项目等级:" +
scp1.getLevel() + "。性别:" + SCP.getGender());
}
}
打印结果如下图所示
//采用反射的方法(详细步骤),访问非静态属性和非静态方法
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class SCPTest {
@Test
//第一步:获取Class的三种方式,且三种方式等价
public void step1() throws ClassNotFoundException {
//方式一:
Class<SCP> clazz1 = SCP.class; //加上泛型就不用强转了
//方式二:
SCP scp = new SCP();
Class clazz2 = scp.getClass();
//方式三:
Class clazz3 = Class.forName("Summary.SCP");
System.out.println(clazz3);
}
@Test
//第二步:创建运行时类的对象
public void step2() throws Exception {
Class<SCP> clazz1 = SCP.class;
SCP scp = clazz1.newInstance();
}
@Test
//第三步:获取运行时类中指变量名的属性、方法
public void step3() throws Exception {
Class<SCP> clazz1 = SCP.class;
SCP scp = clazz1.newInstance();
//获取运行时类中指变量名的属性
Field name = clazz1.getDeclaredField("name");
Field id = clazz1.getDeclaredField("id");
Field level = clazz1.getDeclaredField("level");
//保证当前属性是可访问的
name.setAccessible(true);
id.setAccessible(true);
level.setAccessible(true);
//填参数
name.set(scp,"不灭孽蜥");
id.set(scp,682);
level.set(scp,"Keter");
System.out.println("项目编号:" + "SCP-" + id.get(scp) + "," + name.get(scp) + "。项目等级:" +
level.get(scp));
System.out.println("");
//获取运行时类中指变量名的方法
Method description = clazz1.getDeclaredMethod("description", String.class);
//保证当前属性是可访问的
description.setAccessible(true);
Object wisdom = description.invoke(scp, "智慧(这是private修饰的私有方法,访问到了)");//填参数
}
}
采用反射打印结果如下
//采用反射的方法(详细步骤),访问静态属性和静态方法
import Reflection2.Person1;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
//下列代码为获取静态属性和静态方法
public class SCPTestStatic {
@Test
public void testStatic() throws Exception {
Class<SCP> clazz1 = SCP.class;
SCP scp = clazz1.newInstance();
//获取运行时类中指变量名的静态属性
Field gender = clazz1.getDeclaredField("gender");//静态属性
gender.setAccessible(true);
gender.set(Person1.class,"未知");
System.out.println("SCP-682的性别:" + gender.get(SCP.class));
//获取运行时类中指变量名的静态方法
Method show = clazz1.getDeclaredMethod("show");
show.setAccessible(true);
show.invoke(SCP.class);
}
}
反射访问静态属性和静态方法如下图所示
本文地址:https://blog.csdn.net/qq_38050259/article/details/112687293
上一篇: JSP标准动作简介
下一篇: 2020-11-09