1.什么是反射机制
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
2.反射的特点:动态性
3.通过反射调用成员变量及成员方法
public class Person { private String name; private int 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; } public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this.name = name; } public Person() { } public void show() { System.out.println("HelloWorld"); } private void shownation(String nation) { System.out.println("HelloWorld"+nation); //return nation; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
//相对应的包 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;
//具体使用 Class zz = Person.class; Person person = (Person) zz.newInstance(); Field f1 = zz.getDeclaredField("name"); f1.setAccessible(true); f1.set(person, "aaaa"); //private私有属性获取 Field f2 = zz.getDeclaredField("age"); f2.setAccessible(true); f2.set(person, 20); //通过反射调用运行时类的指定方法 Method m1 = zz.getMethod("show"); m1.invoke(person); Method m2 = zz.getDeclaredMethod("shownation", String.class); //私有的需要设置可见性 m2.setAccessible(true); m2.invoke(person, "Canada"); //通过反射创建对象----利用构造函数 Constructor cons = zz.getConstructor(String.class, int.class); Object obj = cons.newInstance("pikaqiu~", 3); Person o = (Person) obj; System.out.println(o.toString());
4.获取Class实例的方式
//方式一:调用运行时类的属性 .class Class ss1=Person.class; System.out.println(ss1); //方式二:通过运行时类的对象,调用getClass() Person p1=new Person(); Class ss2=p1.getClass(); System.out.println(ss2); //方式三:调用Class的静态方法:forName(String classath) Class ss3=Class.forName("Person"); System.out.println(ss3);
5.类的加载
程序经过javac.exe命令以后,会生成一个或多个字 节码文件(.class结尾)。
接着我们使用java. exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程就称为类的加载
6.运行时类
加载到内存中的类,我们就称为运行时类,成为Class的一个实例