1.什么是反射?有什么用?
在java运行过程种,任何一个类,我们都能获得它的属性和方法,任何一个对象我们都能调用它的属性和方法,这种动态获取信息和动态调用对象属性方法的功能被称为java反射机制。
总的来说,反射就是将java类中的各种成分映射成一个个的java对象。
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。
2.使用
我们首先要获取class对象,才能获取该类的所有属性和方法。
1.获取class对象的方式
(1) 通过 对象.getClass() 比如:student.getClass()
(2) 任何类都有一个静态的class属性,通过类名.class来获取,比如:int.class,Student.class
(3) 通过Class类的静态方法:Class.forName(“Student”)
通常我们使用第三种方式,因为可以直接通过出入一个类路径字符串就可以了。第一种还需要创建一个对象,第二种需要引入相关类的包。
2.通过反射获取方法和变量并调用
创建一个student对象:包含3个构造方法,4个成员变量和成员方法
public class Student {
public String name;
protected int age;
char sex;
private String phoneNum;
public Student() {
System.out.println("无参构造方法");
}
public Student(String str) {
System.out.println("默认构造方法"+str);
}
public Student(String name,int age) {
System.out.println("姓名"+name+" 年龄"+age);
}
public void show1(String s){
System.out.println("调用了:公有的,String参数的show1(): s = " + s);
}
protected void show2(){
System.out.println("调用了:受保护的,无参的show2()");
}
void show3(){
System.out.println("调用了:默认的,无参的show3()");
}
private String show4(int age){
System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
return "abcd";
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", phoneNum=" + phoneNum + "]";
}
}
反射调用方法:
- 通过Class.forName()获取class对象
- 通过getConstructor()方法获取特定的构造方法,参数列表传入所有参数;通过class对象Constructor接受获取的构造方法,调用newInstance创建该类的实例
- 通过getMethod()方法获取成员方法,通过m.invoke()调用成员方法,传入该对象的实例和成员方法的参数
- 通过getField()方法获取指定的成员变量,调用成员变量的set方法为该对象的成员设置值。
public class FanSeMethod {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//1.获取class对象
Class clazz = Class.forName("FanSe.Student");
//2.获取构造方法(特定的构造方法,传入参数class对象)
Constructor con = clazz.getConstructor(String.class,int.class);
//3.通过构造方法调用newInstance创建对象
Object obj = con.newInstance("张三",4);
System.out.println(obj);
//4.获取成员方法(获取特定的成员方法,传入方法名,和参数class对象)
Method m = clazz.getMethod("show1", String.class);
//通过m.invok去调用该obj对象的方法
m.invoke(obj, "张三");
//5.获取成员变量
Field f = clazz.getField("name");
f.set(obj, "张三");
System.out.println(obj);
}
}


被折叠的 条评论
为什么被折叠?



