
能分析类信息的能力叫做反射。
二、反射是如何工作的 三、如何获取class对象四、 class对象的功能
class类
public class Dog {
private Integer age = 18;
public String name = "大雄";
protected Character sex = '男';
String eat = "站着吃";
public void run() {
System.out.println("大雄跑的很快");
}
public void eat() {
System.out.println("大雄吃的很多");
}
private void flog(String name) {
System.out.println(name + "会飞");
}
public Dog() {
}
private Dog(int age, String name, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Character getSex() {
return sex;
}
public void setSex(Character sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Dog{" + "age=" + age + ", name='" + name + ''' + ", sex=" + sex + '}';
}
}
一、关于全局变量
1.关于获取全局变量
类对象名称.getFields() Field[]数组进行接收 只能获取由public修饰的变量
类对象名称.getDeclaredFields() Field[]数组进行接收 获取所有的变量
类对象名称.getField("指定变量") Field进行接收 只能获取由public修饰的指定变量
类对象名称.getDeclaredField("指定变量") Field进行接收 获取到指定的变量(所有变量中)
2.Field成员变量的基本 *** 作
1.设置值set(Object obj,Object value)
①:new出我们对象:我们需给赋的值内存空间进行表达
②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:调用set()方法,传递两个参数,第一个是我们new出的对象,第二个是我们想要赋的值 2.获取值get(Object obj)
①:new出我们对象:我们需给赋的值内存空间进行表达
②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:调用get()方法并且将创建出来的对象当成参数进行传递,用Object来进行返回值的接收
import java.lang.reflect.Field;
public class Test2 {
public static void main(String[] args) throws Exception {
// class.forName("全类名")
Class class1 = Class.forName("com.qcby.Fs.Dog");
// 变量
Field[] fields = class1.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("---------------------------------");
Field[] fields1 = class1.getDeclaredFields();
for (Field field : fields1) {
System.out.println(field);
}
System.out.println("---------------------------------");
Field fieldName = class1.getField("name");
System.out.println(fieldName);
Dog dog = new Dog();
fieldName.set(dog, "大雄");
Object o = fieldName.get(dog);
System.out.println(o);
System.out.println("---------------------------------");
Field fieldAge = class1.getDeclaredField("age");
System.out.println(fieldAge);
Dog dog1 = new Dog();
fieldAge.setAccessible(true);//暴力反射
fieldAge.set(dog1, 20);
Object o1 = fieldAge.get(dog1);
System.out.println(o1);
}
}
二、关于方法
1.关于获取方法
类对象名称.getMethods() Method[]数组进行接收 只能获取由public修饰的方法
类对象名称.getDeclaredMethods() Method[]数组进行接收 获取所有的方法
类对象名称.getMethod("指定方法名称",参数类型.class……) Method进行接收 只能获取由public修饰的指定方法
类对象名称.getDeclaredMethod("指定方法名称",参数类型.class……) Method进行接收 获取到指定的方法(所有方法中)
2.关于对方法 *** 作 invcke() //对方法的执行
①:new出我们对象:我们需给赋的值内存空间进行表达
②:判断我们所获取的方法是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:调用invcke()方法,传递两个参数,第一个是我们new出的对象,第二个是我们想要赋的值
import java.lang.reflect.Method;
public class Test2 {
public static void main(String[] args) throws Exception {
// class.forName("全类名")
Class class1 = Class.forName("com.qcby.Fs.Dog");
// 方法
Method[] m1 = class1.getMethods();
for (Method method : m1) {
System.out.println(method);
}
System.out.println("---------------------------------------");
Method[] m2 = class1.getDeclaredMethods();
for (Method method : m2) {
System.out.println(method);
}
Dog dog = new Dog();
Method Mdog = class1.getMethod("run");
Mdog.invoke(dog);
Dog dog2 = new Dog();
Method Mdog2 = class1.getDeclaredMethod("flog", String.class);
Mdog2.setAccessible(true);//暴力反射
Mdog2.invoke(dog2, "张二麻子");
}
}
三、关于构造器
1.关于获取构造器
类对象名称.getConstructors() Constructor[]数组进行接收 只能获取由public修饰的构造器
类对象名称.getDeclaredConstructors() Constructor[]数组进行接收 获取所有的构造器
类对象名称.getConstructor(参数类型.class ...) Constructor进行接收 只能获取由public修饰的指定构造器
类对象名称.getDeclaredConstructor(参数类型.class ...) Constructor进行接收 获取到指定的构造器(所有构造器中)
2.关于对构造器 *** 作 newInstance(参数值.....) 创建对象
①:new出我们对象:我们需给赋的值内存空间进行表达
②:判断我们所获取的构造器是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:newInstance(参数值.....),传递参数,我们想要赋的值
import java.lang.reflect.Constructor;
public class Test2 {
public static void main(String[] args) throws Exception {
// class.forName("全类名")
Class class1 = Class.forName("com.qcby.Fs.Dog");
// 构造器
Constructor[] C1 = class1.getConstructors();
for (Constructor constructor : C1) {
System.out.println(constructor);
}
Constructor[] C2 = class1.getDeclaredConstructors();
for (Constructor constructor : C2) {
System.out.println(constructor);
}
Constructor C3 = class1.getConstructor();
Object o = C3.newInstance();
System.out.println(o);
Constructor C4 = class1.getDeclaredConstructor(int.class, String.class, char.class);
C4.setAccessible(true);//暴力反射
Object o1 = C4.newInstance(12, "小卡", '女');
System.out.println(o1);
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)