十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
什么是反射?
成都创新互联公司自成立以来,一直致力于为企业提供从网站策划、网站设计、成都网站建设、网站制作、电子商务、网站推广、网站优化到为企业提供个性化软件开发等基于互联网的全面整合营销服务。公司拥有丰富的网站建设和互联网应用系统开发管理经验、成熟的应用系统解决方案、优秀的网站开发工程师团队及专业的网站设计师团队。
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(); 无锡妇科医院 http://mobile.wxbhnkyy39.com/
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();
}
}