反射
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
通过反射机制实例化一个类的对象
package com;
public class fanshe {
public static void main(String[] args) {
try {
Class c1 = Class.forName("com.User");
System.out.println(c1.hashCode());
User user = new User();
Class c2 = user.getClass();
System.out.println(c2);
System.out.println(c2.hashCode());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
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
package com;
import java.lang.annotation.ElementType;
public class demo3 {
public static void main(String[] args) {
Class c1 = Object.class;
Class c2 = Comparable.class;
Class c3 = String[].class;
Class c4 = int[][].class;
Class c20 = String[][].class;
Class c5 = ElementType.class;
Class c6 = Override.class;
Class c7 = Integer.class;
Class c8 = Void.class;
Class c9 = Class.class;
int[] a=new int[10];
int[] b = new int[100];
Class c10 = a.getClass();
Class c11 = b.getClass();
System.out.println(c10==c11);
System.out.println(c20==c4);
System.out.println(c10);
System.out.println(c11);
System.out.println(c1 );
System.out.println(c2 );
System.out.println(c3 );
System.out.println(c4 );
System.out.println(c20);
System.out.println(c5 );
System.out.println(c6 );
System.out.println(c7 );
System.out.println(c8 );
}
}
获得类的信息
package com;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class demo6 {
public static void main(String[] args) throws ClassNotFoundException {
Class c1 = Class.forName("java.lang.String");
//获得名字
System.out.println("-----------------------一条华丽的分割线--------------------------------");
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
//获得属性
System.out.println("-----------------------一条华丽的分割线--------------------------------");
Field[] fields = c1.getFields();//获得类的public属性
for (Field field : fields) {
System.out.println(field);
}
Field[] declaredFields = c1.getDeclaredFields();//获得类的全部属性
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
//获得方法
System.out.println("-----------------------一条华丽的分割线--------------------------------");
Method[] methods = c1.getMethods();//获得本类及其父类的所有public方法
for (Method method : methods) {
System.out.println(method);
}
Method[] declaredMethods = c1.getDeclaredMethods();//获得本类所有方法
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
}
}
动态构造对象,调用方法
package com;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class demo7 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
Class c1 = Class.forName("com.User");
//1.通过动态调用构造方法,构造对象
System.out.println("--------------------------");
User user=(User)c1.newInstance();
System.out.println(user);
//2.通过有参构造创建对象
System.out.println("-------------------");
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);
User user1 = (User)declaredConstructor.newInstance("放",4);
System.out.println(user1);
// 3.调用普通方法
System.out.println("----------------------");
User user2 = (User)c1.newInstance();
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(user2,"df");
System.out.println(user2);
// 4.
System.out.println("--------------------");
User user3 = (User)c1.newInstance();
Field name = c1.getDeclaredField("name");
name.setAccessible(true);
name.set(user3,"ds");
System.out.println(user3.getName());
}
}
package com;
public class demo5 {
public static void main(String[] args) throws ClassNotFoundException {
//1.获得系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
System.out.println(systemClassLoader);
//2.获得系统类加载器的父类加载器-->扩展加载器
ClassLoader parent = systemClassLoader.getParent();
System.out.println(parent);
//3.扩展类加载器的父类---》根加载器
ClassLoader parent1 = parent.getParent();
System.out.println(parent1);
//4.测试当前类是哪个加载器加载的
ClassLoader classLoader = Class.forName("com.demo5").getClassLoader();
System.out.println(classLoader);
//5.测试object类是哪个加载器加载的
ClassLoader classLoader1 = Class.forName("java.lang.Object").getClassLoader();
System.out.println(classLoader1);
//系统类加载器可以加载的类的路径
System.out.println(System.getProperty("java.class.path"));
}
}