1.概述:
- 在运行状态中,对于任意一个类,都能知道这个类的属性和方法。动态获取信息与动态调用对象的方法。
- 通过Class类实现。Class类——描述类的类。
2.获取Class对象:
- 使用forName静态方法;Class.forName("路径");
- 直接获取某一个对象的class; Class <?> demo = int.class;
- 调用某个对象的getClass()方法;
StringBuilder str = new StringBuilder("123");
Class<?> klass = str.getClass();
3.通过反射生成的对象:
1、使用Class对象的newInstance()方法来创建Class对象对应类的实例。
Class <?> c = String.class;
object str = c.newInstance();
2、通过Class对象指定的ConStructor对象,在调用Constructor对象的newIndtance()方法来创建实例。
Class <?> c = String.class;
Constructor constructor = c.getConstructor(String.calss);
Object obj = construtor.newInstance("11");
4.获取方法:
1、getDeclaredMethods()方法返回类或者接口声明的所有方法,但不包括集成的方法。
2、getMethods()方法返回某个类的所有公有(public)方法。
3、getmethod()方法返回特定的方法,第一个参数为方法名,后面的参数为方法对应的Class对象。
public Method getMethod(String name,Class<?>...parametherTypes)
5.获取构造器信息:
通过Class类的getConstructor方法德大Constructor类的一个实例,而Constructor类有熊哥newInstace方法可以创建一个对象实例。
public T newInsrtance(Object...initargs)
6.获取类的成员变量信息:
1、getFiled:访问公有的成员变量。
2、getDeclareField:所有已声明的成员变量。但不能得到其父类的成员变量。
3、getFileds和getDeclaredFields。
7.调用方法:
invoke()方法
原型:
public Object invoke (Object obj,Object...args)
throws IllegalAccessException, IllegalArgumentException,InvocationTargetException
实例:
public class test1 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
Class<?> klass = methodClass.class;
//创建methodClass的实例
Object obj = klass.newInstance();
//获取methodClass类的add方法
Method method = klass.getMethod("add",int.class,int.class);
//调用method对应的方法 => add(1,4)
Object result = method.invoke(obj,1,4);
System.out.println(result);
}
}
class methodClass {
public final int fuck = 3;
public int add(int a,int b) {
return a+b;
}
public int sub(int a,int b) {
return a+b;
}
}
8.利用反射创建数组:
public static void testArray() throws ClassNotFoundException {
Class<?> cls = Class.forName("java.lang.String");
Object array = Array.newInstance(cls,25);
//往数组里添加内容
Array.set(array,0,"hello");
Array.set(array,1,"Java");
Array.set(array,2,"fuck");
Array.set(array,3,"Scala");
Array.set(array,4,"Clojure");
//获取某一项的内容
System.out.println(Array.get(array,3));
}
反射的基本概念:
正常情况下:
- 使用import导入所在包;
- 明确的使用类名称或接口名称定义对象;
- 通过关键字new进行类对象的实例化;
反射:直接利用Object与反射机制的混合调用类中的方法。(不需要明确类型的对象,所有的对象使用Object表示)