//反射:实例成员的使用
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test1 {
public static void main(String[] args) throws Exception {
//1.Class表示所有的类,所有类的在一起就被称为类类型,如果在类类型中定义某个具体的对象,即创建类对象,c1
String className = "com.tencent.test.Student";// 具体完整的包路径+类名称
Class c1 = Class.forName(className);
//2.根据c1类创建对象
// 2.1调用无参构造方式
Object o1 = c1.newInstance();
// 2.2调用带参构造方式
Constructor con = c1.getConstructor(String.class,int.class);//先使用getConstructor方法时需要指定参数(.class)
Object o2 = con.newInstance("张三",19);//再使用newInstance方法时传递一个实参
//3.获取c1类的属性(已经具体为Student类,即获取Student类中的属性)
//3.1 公开的属性:
Field f1 = c1.getField("name");
// 3.1.1获取多个公开的属性
/*
Field[] fs1 = c1.getFields();
for(Field fds1: fs1){
System.out.println(fds1);
}
*/
//3.2 非公开的属性:
Field f2 = c1.getDeclaredField("age");
// 3.2.1获取多个非公开的属性
/*
Field[] fs2 = c1.getDeclaredFields();
for(Field fds2:fs2){
System.out.println(fds2);
}
*/
//4.使用属性(需要先获取属性,即上述步骤3)
//4.1无参
//4.1.1给公开的属性赋值取值
f1.set(o1, "李四");
Object stuname = f1.get(o1);
System.out.println("该学生的姓名为:" + stuname);
//4.1.2给私有的属性赋值取值(必须修改访问权限!!!!)
f2.setAccessible(true);
f2.set(o1, 25);
Object stuage = f2.get(o1);
System.out.println("该学生的年龄是:" + stuage);
//4.2带参
System.out.println(o2);
//5.获取c1类方法(已经具体为Student类,即获取Student类中的方法)
//5.1无参无返回值
//5.1.1公开的方法
Method m1 = c1.getMethod("study");
//5.1.2私有的方法
Method m2 = c1.getDeclaredMethod("play");
//5.2有参有返回值
//5.2.1公开的方法
Method m3 = c1.getMethod("look", String.class);
//5.2.2私有的方法
Method m4 = c1.getDeclaredMethod("shooping", int.class);
//6.使用方法(需要先获取方法,即上述步骤5)
//6.1无参无返回值
//6.1.1公开的方法
m1.invoke(o1);
//6.1.2私有的方法(必须修改访问权限!!!!)
m2.setAccessible(true);
m2.invoke(o1);
//6.2有参有返回值
//6.2.1公开的方法
Object in1 = m3.invoke(o1, "海底两万里");
System.out.println("正在看的书:"+in1);
//6.2.2私有的方法(必须修改访问权限!!!!)
m4.setAccessible(true);
Object in2 = m4.invoke(o1, 126);
System.out.println("还剩" + in2 + "块钱");
}
}
class Student {
//1.实例属性
//1.1公开属性
public String name;
//1.2非公开属性
private int age;
//2.构造方法
//2.1无参构造
public Student(){
}
//2.2带参构造
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//3.实例方法
//3.1无参无返回值
//3.1.1公开
public void study() {
System.out.println("正在学习……");
}
//3.1.2非公开
private void play(){
System.out.println("正在玩游戏……");
}
//3.2有参有返回值
//3.2.1公开
public String look(String book){
String bookName="《"+book+"》";
return bookName;
}
//3.2.2非公开
private int shooping(int money){
int surplusMoney=money-25;
return surplusMoney;
}
}
运行后: