反射机制的实现过程:java语言编译后会产生一个.class文件,反射就是通过一个字节码文件找到某一个类、类中的方法以及属性。
反射的实现类:
Class:类的对象
Constructor:类的构造方法
Field:类中的属性对象
Method:类中的方法对象
作用:反射机制指的是程序在运行的时候能够获得自身的信息。在Java中,只要给定类的名字,那么就可以通过反射机制来获取类的所有信息。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import test.bean.User;
public class test {
public static void main(String[] args)
{
String path = "test.bean.User";
try {
Class<User> clazz = (Class<User>) Class.forName(path);
//对象是表示或封装一些数据的,一个类加载后,JVM会创建一个Class对象,类的整个结构信息会被放到对应的Class对象中
这个类就像一面镜子,通过这面镜子我们可以看到对应的全部信息。
System.out.println(clazz);
Class<?> clazz1 = Class.forName(path);
System.out.println(clazz1);
//获取类的名字
System.out.println(clazz.getName());
System.out.println(clazz.getSimpleName());
//获取属性的信息
Field[] field = clazz.getFields();
System.out.println(field.length);// 这里我们获取不到User里面的属性,因为User里面的属性都为private
//如果要获取到private声明的属性,我们可以使用getDeclaredFields()
Field[] field1 = clazz.getDeclaredFields();
System.out.println(field1.length);
for(Field f:field1)
{
System.out.println("属性:"+f);
}
//获取方法的信息
Method[] methods = clazz.getDeclaredMethods();
Method m1 = clazz.getDeclaredMethod("getUname", null);
Method m2 = clazz.getDeclaredMethod("setUname", String.class);//如果方法有参数则必须传递参数类型的class对象。
for(Method m:methods)
{
System.out.println("属性:"+m);
}
//获取构造器信息
//通过反射api调用构造方法
User u = (User) clazz.newInstance();//调用了User的无参构造方法,所以构造方法中要有无参构造方法
System.out.println(u);
Constructor<User> c = (Constructor<User>) clazz.getDeclaredConstructor(int.class,int.class,String.class);
System.out.println(u);
User u2 = c.newInstance(1000,13,"张三");
System.out.println(u2.getUname());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class User {
private int id;
private int age;
private String uname;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public User(int id, int age, String uname) {
super();
this.id = id;
this.age = age;
this.uname = uname;
}
public User()
{
}
}