24-反射
- 反射机制:
- 在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用他的任意一个方法和属性;
- 这种动态获取以及动态的调用对象的功能称之为java的反射机制;
- 功能:
- 1.在运行时判断任意一个对象所属的类;
- 2.在运行时构造任意一个类的对象
- 3.在运行时判断任意一个类所具有的成员变量和方法
- 4.在运行时调用任意一个对象的方法
- 5.生成动态代理
- 实现反射机制功能:
- Class: 代表一个类, java.lang
- Field: 代表类的成员变量(类的属性) java.lang.reflect
- Constructor: 代表类的构造方法
- Method: 代表类的方法
public class User {
private String name;
private int age;
public String gender;
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 String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public User(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public User() {
super();
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
public class Test {
public static void main(String[] args) {
User u1 = new User("清子", 26, "男");
User u2 = new User("菲比", 27, "女");
System.out.println(u1.getClass()==u2.getClass());
System.out.println(u1.getClass());
System.out.println(u2.getClass());
int[] arrayA = new int[4];
int[] arrayB = {11,22};
System.out.println(arrayA.getClass() == arrayB.getClass());
int[][] arrayC = {{11,2}, {33, 44}};
int[][] arrayD = {{}, {}};
System.out.println(arrayC.getClass() == arrayD.getClass());
System.out.println(arrayC.getClass());
System.out.println(int.class);
System.out.println(double.class);
System.out.println(boolean.class);
System.out.println(char.class);
System.out.println(void.class);
}
}
import java.lang.reflect.Modifier;
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cl1 = new User().getClass();
Class<?> cl2 = User.class;
Class<?> cl3 = Class.forName("deskdemo.User");
System.out.println(cl1);
System.out.println(cl2);
System.out.println(cl3);
Class<?> cl4 = cl3.getSuperclass();
System.out.println(cl4);
Class<?> cl5 = Long.class;
Class<?> cl6 = Long.TYPE;
System.out.println(cl5);
System.out.println(cl6);
System.out.println("类的全名称: "+cl3.getName());
System.out.println("类的名称: "+cl3.getSimpleName());
System.out.println("获取类的访问权限的字符串形式: "+Modifier.toString(cl3.getModifiers()));
Class<?> clas = cl3.getSuperclass();
System.out.println("父类的类型: "+clas.getSuperclass());
System.out.println("父类的全名称: "+clas.getSimpleName());
System.out.println("父类的名称: "+clas.getSimpleName());
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class GetConsTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> cla = Class.forName("deskdemo.User");
Constructor<?> [] con = cla.getConstructors();
for(Constructor<?> t: con) {
System.out.println(t);
}
Constructor<?> con1 = cla.getConstructor();
User user = (User) con1.newInstance();
System.out.println(user);
Constructor<?> con2 = cla.getConstructor(String.class, int.class, String.class);
User user1 = (User) con2.newInstance("落天", 12, "男");
System.out.println(user1);
}
}
import java.lang.reflect.Field;
public class GetFieldDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
Class<?> cla = Class.forName("deskdemo.User");
Field[] field = cla.getFields();
for(Field f:field) {
System.out.println(f);
}
Field field1 = cla.getField("gender");
System.out.println(field1);
Field field2 = cla.getDeclaredField("name");
System.out.println(field2);
}
}
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GetMethodDemo {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<User> cla = User.class;
Method[] me = cla.getDeclaredMethods();
for(Method m:me) {
System.out.println(m);
}
System.out.println("=================");
Method[] me1 = cla.getMethods();
for(Method m:me1) {
System.out.println(m);
}
System.out.println("==================");
Method method = cla.getMethod("toString");
System.out.println(method);
System.out.println("======================");
Constructor<User> c = cla.getConstructor();
User user = c.newInstance();
String str = (String) method.invoke(user);
System.out.println(str);
System.out.println("==============");
Method method2 = cla.getMethod("setAge", int.class);
method2.invoke(user, 22);
System.out.println(user.getAge());
}
}