Java反射机制提供的功能
在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象
在运行时判断任意一个类所具有的成员变量和方法在运行时获取泛型信息
在运行时调用任意一个对象的成员变量和方法≥在运行时处理注解
生成动态代理
Java反射优点和缺点一
优点:
可以实现动态创建对象和编译,体现出很大的灵活性
缺点:
对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。
反射相关的主要API
>java.lang.Class :代表一个类
java.lang.ref.ect.Method :代表类的方法
java.lang.reflect.Field :代表类的成员变量
java.lang.reflect.Constructor :代表类的构造器
在Object类中定义了以下的方法,此方法将被所有子类继承
public final Class getClass()
以上的方法返回值的类型是一个Class
类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理
package 反射;
//测试什么是反射
public class Main {
public static void main(String[] args)throws ClassNotFoundException {
//通过反射获取类的class对象
Class c1= Class.forName("反射.Main");
System.out.println(c1);//打印看看反射出来的对象是怎么样的,可以通过c1.,来查看他可以使用的方法
//创建多个class,使用hashCode来看看他们是否相等,如果hashCode一样,就表示他们是一个类
Class c2= Class.forName("反射.Main");
Class c3= Class.forName("反射.Main");
Class c4= Class.forName("反射.Main");
//一个类在内存只,只有一个class对象
//一个类被加载后,类的整个结构都会被封装在Class对象中
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
}
}
//实体类:pojo,entity:来表示实体类
class User{
private String name;
private int id;
private int age;
public User(){
}
public User(String name,int id,int age){
this.name=name;
this.id=id;
this.age=age;
}
public void setNmae(String name){
this.name=name;
}
public String getName(){
return name;
}
//------------------
public void setId(int id){
this.id=id;
}
public int getId(){
return id;
}
//--------------
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
//输出方法
public String toString(){
return "User{"+"name="+name+"id="+id+"age="+age+"}";
}
}