反射的概念以及应用
反射的概述
每个.java文件对应一个.class文件。每个.class文件对应一个class对象
一个类的字节码文件只会被加载一次
public static void main(String[] args) throws ClassNotFoundException {
//方式一
Student s = new Student();
Class clazz = s.getClass();
//方式二
Class clazz2 = Student.class;
//方式三
Class clazz3 = Class.forName("cn.reflex1.demo.Student");
System.out.println(clazz == clazz2);
System.out.println(clazz2 == clazz3);
System.out.println(clazz == clazz3);
}
}
反射方式获取构造方法并使用
public class Student {
public Student() {
}
public Student(String name) {
System.out.println("您输入的名字是:" + name);
}
private Student(int age) {
System.out.println("您输入的年龄是:" + age);
}
}
import java.lang.reflect.Constructor;
public class test2 {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("cn.reflex1.demo.Student");
Constructor con = clazz.getConstructor();
System.out.println(con);
System.out.println("--------------------------------");
Constructor con2 = clazz.getConstructor(String.class);
System.out.println(con2);
System.out.println("--------------------------------");
Constructor con3 = clazz.getDeclaredConstructor(int.class);//这个可以访问私有的构造函数
System.out.println(con3);
System.out.println("---------------------------------");
Constructor con4[] = clazz.getConstructors();//只能访问共有的构造函数,私有构造函数的不可以访问
for (Constructor constructor : con4) {
System.out.println(constructor);
}
}
}
使用构造方法
import java.lang.reflect.Constructor;
public class test2 {
public static void main(String[] args) throws Exception {
/* Class clazz = Class.forName("cn.reflex1.demo.Student");
Constructor con = clazz.getConstructor();
System.out.println(con);
System.out.println("--------------------------------");
Constructor con2 = clazz.getConstructor(String.class);
System.out.println(con2);
System.out.println("--------------------------------");
Constructor con3 = clazz.getDeclaredConstructor(int.class);//这个可以访问私有的构造函数
System.out.println(con3);
System.out.println("---------------------------------");
Constructor con4[] = clazz.getConstructors();//只能访问共有的构造函数,私有构造函数的不可以访问
for (Constructor constructor : con4) {
System.out.println(constructor);
}*/
Class clazz2 = Class.forName("cn.reflex1.demo.Student");
Constructor con1 = clazz2.getConstructor(String.class);
String name = con1.getName();
System.out.println(name);
Student stu = (Student)con1.newInstance("张三");
System.out.println(stu);
}
}
反射方式获取和使用成员方法
public class Stu {
private String name;
public Stu(){}
public Stu(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
'}';
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class test4 {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("cn.reflex1.demo.Stu");
Constructor con = clazz.getConstructor();
Stu s = (Stu)con.newInstance();
Method method = clazz.getMethod("setName", String.class);
method.invoke(s,"法外狂徒张三");
System.out.println(s);
}
}
通过反射方式获取以及使用成员变量
public class Students {
public String name;
private int age;
public Students() {
}
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class test5 {
public static void main(String[] args) throws Exception {
//获取类对象
Class clazz = Class.forName("cn.reflex1.demo.Students");
//获取构造器并使用
Constructor con = clazz.getConstructor();
Students stu = (Students)con.newInstance();//使用
//获取公有成员变量并使用
Field field = clazz.getField("name");
field.set(stu,"张三");//使用
//获取私有成员变量并使用(记得用暴力反射打开访问权)
Field field2 = clazz.getDeclaredField("age");
field2.setAccessible(true);
field2.set(stu,18);
//输出结果
System.out.println(stu);
}
}