反射:
反射是java被视为动态语言的关键,反射机制允许程序在运行期间,借助反射接口取动态的获取任何类的信息,并能直接操作任意对象的属性及其方法;
正常方式:引入需要的包类名称>>通过new实例化>>获取实例化对象;
反射方式:实例化对象>>getClass()方法>>得到完整的包类名称;
java反射提供的功能:
在运行期间判断任意一个对象所属的类
在运行期间构造任意一个类的对象
在运行期间判断一个类的方法和成员变量
在运行时获取泛型信息
在运行期间调用任意一个类的方法和成员变量
在运行时处理注解
生成动态代理
…
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class c = Class.forName("rlw.User");
System.out.println(c.getName()+c.getMethods());
}
}
class User{
private String id;
private String name;
public User() {
}
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Class类:
对照镜子后可以得到信息:某个类的属性,方法和构造器,某个类到底实现了哪些接口,
Class本身也是一个类,
Class对象只能由系统创建对象,
一个加载的类再jvm中之后又一个class实例,
一个Class对象对应的是一个加载到jvm中的一个.class文件,
每个类的实例对会记得自己是由哪个Class实例生成,
通过Class可以完整的得到一个类中的所有被加载的结构
Class类是Reflection的根源,针对任何你想动态的加载,运行的类,为有先获得相应的Class对象。
Class类的创建方式:
public class Test2 {
//Class类的创建方式
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student();
//1通过对象获得
Class c1 = person.getClass();
System.out.println(c1.hashCode());
//2通过forname获得
Class c2 = Class.forName("rlw.Student");
System.out.println(c2.hashCode());
//3通过类型.class获得
Class<Student> c3 = Student.class;
System.out.println(c3.hashCode());
//4获得父类
Class<Student> c4 = Student.class;
System.out.println(c4.getSuperclass());
}
}
class Person{
public String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
", name='" + name + '\'' +
'}';
}
}
class Student extends Person{
public Student(){
this.name="学生";
}
}
class Teacher extends Person{
public Teacher(){
this.name="老师";
}
}