什么是反射?
java 反射,就是在运行状态中。
- 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
- 获取任意对象的属性,并且能改变对象的属性
- 调用任意对象的方法
- 判断任意一个对象所属的类
- 实例化任意一个类的对象
java 的动态就体现在这。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的过度使用会严重消耗系统资源。
jdk 中 java.lang.class 类,就是为了实现反射提供的核心类之一。
获取 class 的方法 、一个 jvm 中一种 class 只会被实例化一次
package constxiong.interview;
/**
* 测试 class 类相关
* @author constxiong
* @date 2019-06-14 10:13:05
*/
public class testclass {
public static void main(string[] args) throws classnotfoundexception {
testgetclass();
}
/**
* 测试获取 class 对象,获取 class 名称
* @throws classnotfoundexception
*/
@suppresswarnings("rawtypes")
public static void testgetclass() throws classnotfoundexception {
testclass t = new testclass();
class class1 = t.getclass();
system.out.println(class1.getname());
class class2 = testclass.class;
system.out.println(class2.getname());
class class3 = class.forname("constxiong.interview.testclass");
system.out.println(class3.getname());
//一个 jvm 中一种 class 只会被实例化一次,对上面的 class 实例进行判断发现都是相等的
system.out.println(class1 == class2);
system.out.println(class1 == class3);
}
}
class 类中方法测试
package constxiong.interview;
/**
* 测试 class 类相关
* @author constxiong
* @date 2019-06-14 10:13:05
*/
public class testclass {
private int i = 0;
public int j = 1;
private void t() {
system.out.println("调用 testclass 对象的 t() 方法");
}
public static void main(string[] args) throws classnotfoundexception {
testclassmethod();
}
/**
* 测试 class 对象的方法
*/
public static void testclassmethod() {
class clazz = testclass.class;
system.out.println("clazz.getname() --> " clazz.getname());//获取类全名(包含路径)
system.out.println();
system.out.println("clazz.getsimplename() --> " clazz.getsimplename());//获取类简称
system.out.println();
system.out.println("clazz.getsuperclass() --> " clazz.getsuperclass());//获取父类
system.out.println();
system.out.println("clazz.isinterface() --> " clazz.isinterface());//判断是否为接口
system.out.println();
system.out.println("clazz.getfields() --> " join(clazz.getfields(), "\r\n"));//获取 public 字段,包含父类 public 字段
system.out.println();
system.out.println("clazz.getdeclaredfields() --> " join(clazz.getdeclaredfields(), "\r\n"));//获取所有字段
system.out.println();
system.out.println("clazz.getmethods() --> " join(clazz.getmethods(), "\r\n"));//获取 public 方法,包含父类 public 方法
system.out.println();
system.out.println("clazz.getdeclaredmethods() --> " join(clazz.getdeclaredmethods(), "\r\n"));//获取所有字段
system.out.println();
system.out.println("clazz.getconstructors() --> " join(clazz.getconstructors(), "\r\n"));//获取构造方法
system.out.println();
try {
clazz.newinstance().t();//实例化 testclass 对象,调用对象中的 t() 方法
} catch (instantiationexception e) {
e.printstacktrace();
} catch (illegalaccessexception e) {
e.printstacktrace();
}
}
/**
* 拼接数组成字符串
* @param objs
* @param s
* @return
*/
private static string join(object[] objs, string s) {
stringbuilder r = new stringbuilder();
for (object obj : objs) {
r.append(obj).append(s);
}
return r.tostring();
}
}