学生类
package mytest.day1221;
public class Student {
public String name;
public int age;
public void study(){
System.out.println("study方法被调用");
}
public void eat(String food){
System.out.println("eat方法被调用");
System.out.println(name+"吃了"+food);
}
private String buy(){
System.out.println("buy方法被调用");
return "buy方法的返回值";
}
public String money(int num){
System.out.println(name+"领到一个"+num+"红包");
return "100";
}
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试
package mytest.day1221;
/*
<<反射的基本使用>>
一.获取类字节码对象
1: 对象名.getClass()
2:类名.class
3.通过Class的静态方法: Class.forName("全类名")
二.获取构造方法对象和使用
1.getDeclaredConstructors():获取一个类中所有的修饰的构造方法对象,并存入到Constructor数组中
2.getDeclaredConstructor(Class...parameterTypes):获取一个类中指定的某个构造方法对象 (Class...parameterTypes:形参数据类型的字节码对象)
3.T newInstance(Object...initargs):让构造方法对象自己启动,创建对象 ( Object...initargs:启动该构造方法需要的实际参数)
三.获取成员变量对象和赋值
1. Field[] getDeclaredFields():获取一个类中所有的成员变量对象
2.Field getDeclaredField(String name):获取一个类中指定名称的成员变量对象 (String name:你要获取的成员变量对象的变量名称)
3. Field类中的方法:
Object get(Object obj):获取指定对象的该成员变量的值
Object obj:哪个对象的该属性
Object:代表的就是你获取的这个成员变量的具体值
void set(Object obj, Object value):
Object obj:哪个对象的该属性
Object value:你要设置的值
四.获取成员方法对象和使用
1.Field[] getDeclaredMethods():获取一个类中所有的成员方法对象
2.Field getDeclaredMethod(String name,Class...parameterTypes):获取一个类中指定名称的成员方法对象(String name:你要获取的成员方法对象的方法名称,不要带上方法的小括号
Class...parameterTypes:此方法参数类型的字节码对象 --> 区分重载方法的)
3.获取了方法对象,可以启动方法 ----> 对象.方法
Object invoke(Object obj, Object... args)
Object obj:对象 ---> 哪个对象启动这个方法
Object...args:启动方法需要的实际参数
Object:启动方法,方法如果有返回值Object就来接收方法的返回值,若方法无返回值Object接收的值就是null
*/
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test01 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException, IllegalAccessException, InvocationTargetException, InstantiationException {
//**获取类的对象三种方法**
//1: 对象名.getClass()
Student stu = new Student();
Class clazz1 = stu.getClass();
//2:类名.class
Class clazz2 = Student.class;
//3.通过Class的静态方法: Class.forName("全类名")
Class clazz3 = Class.forName("mytest.day1221.Student");
//----------------------构造方法对象-----------------------------
System.out.println("-------------------------构造方法对象--------------------");
//获取Student里面所有构造方法的对象并入数组
Constructor[] constructors = clazz1.getDeclaredConstructors(); //遍历打印
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
//获取Student里面指定构造方法的对象(这里以Student(String name,int age)为例)
Constructor declaredConstructor = clazz1.getDeclaredConstructor(String.class, int.class);
System.out.println("declaredConstructor = " + declaredConstructor);
//获取Student里面指定构造方法的对象,用构造方法给成员变量赋值
Constructor declaredConstructor1 = clazz2.getDeclaredConstructor(String.class, int.class);
Object name1 = declaredConstructor1.newInstance("马天宇", 24);
System.out.println("name1 = " + name1);
//-------------------------成员变量对象--------------------
System.out.println("-------------------------成员变量对象--------------------");
//获取clazz1成员对象并入数组
Field[] declaredFields = clazz1.getDeclaredFields(); //遍历打印
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
//获取指定成员对象
System.out.println("-----------赋值前-------------");
Field name = clazz1.getDeclaredField("name");
Object studentName1 = name.get(stu);
System.out.println("studentname1 = " + studentName1);
Field age = clazz1.getDeclaredField("age");
Object studentAge1 = age.get(stu);
System.out.println("studentage1 = " + studentAge1);
System.out.println("-----------赋值后-------------");
//给clazz1的name赋值
name.set(stu,"王力宏"); //赋值 被赋值的成员变量的对象.set(类对象,赋值)
System.out.println(name.get(stu)); //取值 被赋值的成员变量的对象.get(类对象)
//给clazz1的age赋值
age.set(stu,18);
System.out.println(age.get(stu));
//-----------------------成员方法对象-----------------------------
System.out.println("-------------------------成员方法对象--------------------");
//获取clazz1成员方法对象并入数组
Method[] declaredMethods = clazz1.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) { //遍历打印
System.out.println(declaredMethod);
}
//获取指定成员方法并入数组
Method money = clazz1.getDeclaredMethod("money", int.class);
//方法的调用
money.invoke(stu, 100); //调用money方法
//没有访问权限的方法必须在使用之前开启暴力反射开关 无视修饰符(这里以 private String buy() 为例)
//setAccessible(boolean flag):默认是false,现在把它改成true
Method buy = clazz1.getDeclaredMethod("buy");
buy.setAccessible(true);
buy.invoke(stu); //调用buy方法
}
}
上课基本重要知识点囊括总结,不足之处指正,一起学习进步