理解反射
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射也可以跳过泛型
实现反射的方法
Object类之中存在有一个getClass()方法:public final Class<?> getClass();
此方法不能被子类所复写,所有类的实例化对象都可以引用
利用"包.类.class"的形式实例化Class类对象
例如:java.util.Date.class,在一些开源框架中会大量使用
利用Class类中的提供的forName()方法(常用)。
使用反射调用方法
- forName()方式
public class Test {
public static void main(String[] args) {
try {
//第一种,类名.calss
Class c1 = Demo.class;
//第二种,使用类的对象
Demo demo1 = new Demo();
Class c2 = demo1.getClass();
//第三种
Class c3 = Class.forName("com.sank.reflect.test.Demo");
//使用反射调用方法
((Demo)c3.newInstance()).demo(); //使用newInstance时,类中必须有构造方法
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Demo {
public void demo(){
System.out.println("hello");
}
}
2.getClass方式
public class Test{
public static void main(String[] args) {
A a = new A();
Class<? extends A> c = a.getClass();
try {
Method method = c.getMethod("print", int.class, int.class);
method.invoke(a,20,30);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A{
public void print(int a,int b){
System.out.println(a+b);
}
}
使用反射调用成员变量
package com.sank.reflect.reflectmember;
import java.lang.reflect.Field;
/**
* @description:
* @auther Sank
* @date 2018/9/19 17:01
*/
public class Test {
public static void main(String[] args) {
ClassUtil.mumber(new Demo());
}
}
class ClassUtil{
public static void mumber(Object o){
Class<?> c = o.getClass();
System.out.println("类的名称是:"+c.getName());
Field[] fs = c.getDeclaredFields();
for (Field field:fs) {
System.out.println(field.getType().getName()+" "+field.getName());
}
}
}
class Demo {
int n1 = 10;
private float n2 = 4.5F;
protected double n3 = 4.6D;
long n4 = 900000L;
private boolean n5 = false;
}