import java.io.File;
import java.io.FileDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class a200528反射 {
public static void main(String[] args) {
try{
Class<?> a = 儿子.class;
Constructor constructor =a.getDeclaredConstructor(String.class,int.class);//单个方法
constructor.setAccessible(true);
儿子 s1 = (儿子) constructor.newInstance("张飞",18);
//System.out.println(s1); //1
Field file = a.getDeclaredField("age");//单个属性
file.setAccessible(true);
file.setInt(s1,90);
//System.out.println(s1); //2
//System.out.println(file); //3
Field[] fields= a.getDeclaredFields();
for (Field f:
fields) {
System.out.println(f);
}
System.out.println("==================================");
Field[] fields1= a.getFields();
for (Field f:
fields1) {
System.out.println(f);
}
Constructor[] constructors = a.getDeclaredConstructors();
for(Constructor constructor1 : constructors){
//System.out.println(constructor1);
}
Method[] methods = a.getDeclaredMethods();
for(Method method : methods){
//System.out.println(method);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
class 爸爸{
public double height = 80.80;
private String 老婆;
public void 跑步(){}
private void 午饭吃的啥(){}
}
class 儿子 extends 爸爸{
public String name;
private int age = 18;
private String 妈妈;
private 儿子(String name, int age) {
this.name = name;
this.age = age;
}
private void 上课(){}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
通过反射可以获取到private的构造方法
加了Declared只能获取自己的所有field、constructor、method(包括private),不加就只能获得自己和父类的所有public的field、constructor、method
用例2:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class aaa {
public static void main(String[] args) {
// 经理 p = new 经理("张三",10001,9000);
// System.out.println(p);
// 雇员 a1 = new 经理();
// 经理 b = (经理) a;
try{
Class<?> a = 经理.class;
Constructor constructor = a.getDeclaredConstructor(String.class,int.class,int.class);
constructor.setAccessible(true);
经理 p = (经理) constructor.newInstance("李四",10001,70000);
//System.out.println(p.salary);
Field field = a.getField("salary");
field.setAccessible(true);
field.setInt(p,8000);
//System.out.println(p.salary);
System.out.println(p.toString());
//============================================
Class<?> b = a.getSuperclass();//获取到父类的class,以相同操作获得父类的相关属性方法
Constructor constructor1 = b.getDeclaredConstructor();
雇员 p1 = (雇员) constructor1.newInstance();
System.out.println(p1.toString());
//method用法 方法名 传入的参数类型new Class[]{},无参不写
Method method = b.getDeclaredMethod("吃东西",String.class);
//访问属性设置为ture
method.setAccessible(true);
//调用方法的对象,传参new Object[]{},跟上边保持一致
method.invoke(p1,"香蕉");
}catch (Exception e){
e.printStackTrace();
}
}
}
class 雇员{
private String 开除时间;
public int salary ;
public 雇员(){
this.开除时间="十年后";
this.salary=10000;
}
private void 吃东西(String foodName){
System.out.println("今天吃了 "+foodName);
}
public void 使用厕所(){
System.out.println("雇员使用厕所");
}
public 雇员(String 开除时间 ,int salary){
this.salary=salary;
this.开除时间=开除时间;
}
@Override
public String toString() {
return "雇员{" +
"开除时间='" + 开除时间 + '\'' +
", salary=" + salary +
'}';
}
}
class 经理 extends 雇员{
private String name ;
private int num;
public 经理(String name,int num,int salary){
this.name = name;
this.num = num;
this.salary=salary;
}
public void 发起会议(){
System.out.println("经理"+name+"发起了会议");
}
@Override
public String toString() {
return "经理{" +
"salary=" + salary +
", name='" + name + '\'' +
", num=" + num +
'}';
}
}
既可以获取,也可以调用