菜鸟笔记
提升您的技术认知

什么是反射?-ag真人游戏

什么是反射?

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();
	}
}

 

网站地图