反射的简单用法
简单来说:反射的好处就是可以通过一种方法拿到一个类的所有东西(包括属性,构造方法,方法)的一种手段。
所有的前提都是在自己写的User类上展开的,所有的东西没有概念的叙述,适合小白。
public class User {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
获取Class对象的方法
方式一:知道class文件位置的可以用(
这种最常用)
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class user = Class.forName("文件位置");
System.out.println(user);
}
}
方式二:通过类对象来获取Class对象
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
User user1 = new User();
Class c1 = user1.getClass();
System.out.println(c1);
}
}
方法三:通过类名.class获得Class对象
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class s = User.class;
System.out.println(s);
}
}
这三种方法得到的是通一个class对象,可通过对象的hashCode()作比较,根据输出结果可知道三个输入的结果是同一个值,简单的说3个语句的输出是同一个东西。
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class user = Class.forName("User");
User user1 = new User();
Class c1 = user1.getClass();
Class s = User.class;
System.out.println(c1.hashCode());
System.out.println(user.hashCode());
System.out.println(s.hashCode());
}
}
输出结构为
460141958
460141958
460141958
通过反射的Class对象去创建类对象的几种方法
public class Test {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class c1=Class.forName("User");
//通过反射的方法,创建一个对象,类对象自动调用了无参构造方法
User user =(User) c1.newInstance();
System.out.println(user);
//在反射的前提下,类对象调用有参构造器进行创建对象
Constructor constructor = c1.getDeclaredConstructor(String.class, int.class);
User user1 = (User)constructor.newInstance("张三", 12);
System.out.println(user1);
//通过的反射调用方法
User user2 = (User) c1.newInstance();
Method setAge = c1.getDeclaredMethod("setAge", int.class);
setAge.invoke(user2, 18);
System.out.println(user2.getAge());
}
}
输出结果
User{name='null', age=0}
User{name='张三', age=12}
18