0
点赞
收藏
分享

微信扫一扫

day04-20&21反射&Method&Constructor


//反射--field 字段

//1、拿到字段的name

//2、拿到字段的类型

//3、根绝class创建实例,实例可以调用方法

//4、给实例设置属性值,把某个字段的值,设置给一个对象(修改属性的访问权限)

说一下我对反射的理解,就是不直接new 原来的类的情况下,拿到这个类的class,

可以创建实例,可以获取属性和方法,然后再给这个实例设置属性和方法

Demo01

package day04.reflect;
//映射--field 字段
//1、拿到字段的name
//2、拿到字段的类型
//3、根绝class创建实例,实例可以调用方法
//4、给实例设置属性值,把某个字段的值,设置给一个对象(修改属性的访问权限)

import java.lang.reflect.*;

public class Demo01 {
public static void main(String[] args) throws Exception {
// 获取class,3种
// 1种
Class<Student> cls1 = Student.class;
// 2种
Student s = new Student();
Class cls2 = s.getClass();
// 3种,forName+包名.类名
Class cls3 = Class.forName("day04.reflect.Student");


//通过class new一个对象(我感觉其实就是复制了一个类)
Student s2 = cls1.newInstance();


// 获取 class的属性
// cls1.getFields();//只获取public修饰的属性,private属性不能获得
Field[] declaredFields = cls1.getDeclaredFields();//获取类所有的属性,
// 得到的是一个字段的数组
for (Field field:declaredFields){
System.out.println(field.getName());//字段的名称
System.out.println(field.getType().getSimpleName());
//字段的类型,大类型都是class,加上getSimpleName()获取最真实的类型。

if (field.getName()=="name"){// 这里设置name字段
field.setAccessible(true);//原属性都是私有的,不可访问,这里设置true就可以访问了
field.set(s2,"zs");//字段设置,类+字段的内容
field.setAccessible(false);//再把属性的私有改回去,防止被别人使用
}
}
System.out.println("===================");
// Method 方法

// 获取cls1下所有的方法
Method[] declaredMethods = cls1.getDeclaredMethods();

for (Method method:declaredMethods){
System.out.println("方法的名称:"+method.getName());//方法的名称
System.out.println("方法参数的个数"+method.getParameterCount());//方法参数的个数

Parameter[] parameters = method.getParameters();//方法所有的参数
for (Parameter parameter:parameters){
System.out.println("参数的名称"+parameter.getName());//参数的名称
System.out.println("参数的类型"+parameter.getType().getName());//参数的类型
}
//调用某个方法
if(method.getName().equals("study")){
//invoke调用,传对象和参数
method.invoke(s2,"python");

}

int modifiers = method.getModifiers();//方法的修饰符,但是int类型
// 判断 modifiers 是否是public类型
System.out.println(Modifier.isPublic(modifiers));

}

// 构造器
// 构造器是一种特殊的方法,方法的对它同样适用
Constructor<?>[] declaredConstructors = cls1.getDeclaredConstructors();




}
}

Student 

package day04.reflect;

public class Student {
private int age;
private String name;
private char sex;

public void study(String className){
System.out.println(age+sex+name+"学习"+className);
}

@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", sex=" + sex +
'}';
}
}

举报

相关推荐

0 条评论