0
点赞
收藏
分享

微信扫一扫

Java知识【反射知识(2)】


2.4反射获取成员变量并使用【应用】

2.4.1Class类获取成员变量对象的方法

  • 方法分类

方法名

说明

Field[] getFields()

返回所有公共成员变量对象的数组

Field[] getDeclaredFields()

返回所有成员变量对象的数组

Field getField(String name)

返回单个公共成员变量对象

Field getDeclaredField(String name)

返回单个成员变量对象

  • 示例代码

public class Student {

public String name;

public int age;

public String gender;

private int money = 300;

@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", money=" + money +
'}';
}
}
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
// method1();
//method2();
//method3();
//method4();

}

private static void method4() throws ClassNotFoundException, NoSuchFieldException {
// Field getDeclaredField(String name):返回单个成员变量对象
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");

//2.获取money成员变量
Field field = clazz.getDeclaredField("money");

//3.打印一下
System.out.println(field);
}

private static void method3() throws ClassNotFoundException, NoSuchFieldException {
// Field getField(String name):返回单个公共成员变量对象
//想要获取的成员变量必须是真实存在的
//且必须是public修饰的.
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");

//2.获取name这个成员变量
//Field field = clazz.getField("name");
//Field field = clazz.getField("name1");
Field field = clazz.getField("money");

//3.打印一下
System.out.println(field);
}

private static void method2() throws ClassNotFoundException {
// Field[] getDeclaredFields():返回所有成员变量对象的数组
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");

//2.获取所有的Field对象
Field[] fields = clazz.getDeclaredFields();

//3.遍历
for (Field field : fields) {
System.out.println(field);
}
}

private static void method1() throws ClassNotFoundException {
// Field[] getFields():返回所有公共成员变量对象的数组

//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");

//2.获取Field对象.
Field[] fields = clazz.getFields();

//3.遍历
for (Field field : fields) {
System.out.println(field);
}
}
}

2.4.2Field类用于给成员变量赋值的方法

  • 方法介绍

方法名

说明

void set(Object obj, Object value)

赋值

Object get(Object obj)

获取值

  • 示例代码

// Student类同上一个示例,这里就不在重复提供了
public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, InstantiationException {
// Object get(Object obj) 返回由该 Field表示的字段在指定对象上的值。
//method1();
//method2();

}

private static void method2() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");

//2.获取成员变量Field的对象
Field field = clazz.getDeclaredField("money");

//3.取消一下访问检查
field.setAccessible(true);

//4.调用get方法来获取值
//4.1创建一个对象
Student student = (Student) clazz.newInstance();
//4.2获取指定对象的money的值
Object o = field.get(student);

//5.打印一下
System.out.println(o);
}

private static void method1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
// void set(Object obj, Object value):给obj对象的成员变量赋值为value
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect4.Student");

//2.获取name这个Field对象
Field field = clazz.getField("name");

//3.利用set方法进行赋值.
//3.1先创建一个Student对象
Student student = (Student) clazz.newInstance();
//3.2有了对象才可以给指定对象进行赋值
field.set(student,"zhangsan");

System.out.println(student);
}
}

2.5反射获取成员方法并使用【应用】

2.5.1Class类获取成员方法对象的方法

  • 方法分类

方法名

说明

Method[] getMethods()

返回所有公共成员方法对象的数组,包括继承的

Method[] getDeclaredMethods()

返回所有成员方法对象的数组,不包括继承的

Method getMethod(String name, Class<?>… parameterTypes)

返回单个公共成员方法对象

Method getDeclaredMethod(String name, Class<?>… parameterTypes)

返回单个成员方法对象

  • 示例代码

public class Student {

//私有的,无参无返回值
private void show() {
System.out.println("私有的show方法,无参无返回值");
}

//公共的,无参无返回值
public void function1() {
System.out.println("function1方法,无参无返回值");
}

//公共的,有参无返回值
public void function2(String name) {
System.out.println("function2方法,有参无返回值,参数为" + name);
}

//公共的,无参有返回值
public String function3() {
System.out.println("function3方法,无参有返回值");
return "aaa";
}

//公共的,有参有返回值
public String function4(String name) {
System.out.println("function4方法,有参有返回值,参数为" + name);
return "aaa";
}
}
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//method1();
//method2();
//method3();
//method4();
//method5();
}

private static void method5() throws ClassNotFoundException, NoSuchMethodException {
// Method getDeclaredMethod(String name, Class<?>... parameterTypes):
// 返回单个成员方法对象
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.获取一个成员方法show
Method method = clazz.getDeclaredMethod("show");
//3.打印一下
System.out.println(method);
}

private static void method4() throws ClassNotFoundException, NoSuchMethodException {
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.获取一个有形参的方法function2
Method method = clazz.getMethod("function2", String.class);
//3.打印一下
System.out.println(method);
}

private static void method3() throws ClassNotFoundException, NoSuchMethodException {
// Method getMethod(String name, Class<?>... parameterTypes) :
// 返回单个公共成员方法对象
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.获取成员方法function1
Method method1 = clazz.getMethod("function1");
//3.打印一下
System.out.println(method1);
}

private static void method2() throws ClassNotFoundException {
// Method[] getDeclaredMethods():
// 返回所有成员方法对象的数组,不包括继承的
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect5.Student");

//2.获取Method对象
Method[] methods = clazz.getDeclaredMethods();
//3.遍历一下数组
for (Method method : methods) {
System.out.println(method);
}
}

private static void method1() throws ClassNotFoundException {
// Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.获取成员方法对象
Method[] methods = clazz.getMethods();
//3.遍历
for (Method method : methods) {
System.out.println(method);
}
}
}

2.5.2Method类用于执行方法的方法

  • 方法介绍

方法名

说明

Object invoke(Object obj, Object… args)

运行方法

参数一: 用obj对象调用该方法

参数二: 调用方法的传递的参数(如果没有就不写)

返回值: 方法的返回值(如果没有就不写)

  • 示例代码

public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
// Object invoke(Object obj, Object... args):运行方法
// 参数一:用obj对象调用该方法
// 参数二:调用方法的传递的参数(如果没有就不写)
// 返回值:方法的返回值(如果没有就不写)

//1.获取class对象
Class clazz = Class.forName("com.itheima.myreflect5.Student");
//2.获取里面的Method对象 function4
Method method = clazz.getMethod("function4", String.class);
//3.运行function4方法就可以了
//3.1创建一个Student对象,当做方法的调用者
Student student = (Student) clazz.newInstance();
//3.2运行方法
Object result = method.invoke(student, "zhangsan");
//4.打印一下返回值
System.out.println(result);
}
}


举报

相关推荐

0 条评论