java基础之反射

JAVA 反射

一. 概述

    1.1 简述

        反射是java的高级特性,充分利用了JVM的解释机制。和泛型、注解构成了Java最独特的特性,出现了各种增加代码复用的设计思想,直接导致java生态圈丰富框架的出现,其中最出名的是IOC思想的spring。使用的.java文件在编译器编译后成 .class 字节码。然后在classloader的时候会将.class 文件加载并解析到永久区,并在运行时调用class类的方法。

    1.2 java相关类

        a) java.lang.Class:所用的反射的基础,class在创建的时候都是存放在该类下面,从而JVM可以在运行时使用,操作类的数据。

        b) java.lang.reflect.*:class每一个部分的组成都在这个包。例如:构造器、属性

    1.3 class使用:

        a)组成:访问修饰符、类型、超类、接口、泛型类型、属性、方法、注解

        b)所有超类、接口、类以及实例都是class的子类(在内存中,所有的class内容,除去逻辑代码部分,都是挂载在java.lang.class上面)。

二.实例

/**
 * @see 反射接口
 * @author ssHss
 *
 */
public class TestReflect<Lang> extends Reflect1 implements ReIn {

	private String hello1;
	public String hello2;

	public static void main(String[] args) throws Exception {
		Class<?> c = Class.forName("reflect.TestReflect"); // 查找以 TestReflect的.class 文件对象
		Object o = c.newInstance(); // 获取实例
		System.out.println("类型:" + c.getTypeName());
		System.out.println("field");
		// 属性
		Field[] files = c.getFields();
		for (Field field : files) {
			System.out.println("属性名 :" + field.getName() + " 类型 :" + field.getGenericType());
		}
		// 公告属性
		Field[] declearFiles = c.getDeclaredFields();
		for (Field field : declearFiles) {
			System.out.println("属性名 :" + field.getName() + " 类型 :" + field.getGenericType());
		}
		System.out.println("method");
		// 所有方法
		Method[] methods = c.getMethods();
		for (Method method : methods) {
			System.out.println("方法名 :" + method.getName() + " 类型 :" + method.getGenericReturnType());
			method.setAccessible(true);// 使用私有方法
			for (Parameter params : method.getParameters()) {
				System.out.println("方法参数 :" + params.getName() + " 类型 :" + params.getType());
			}
		}
		// 公共方法
		Method[] declearedMethods = c.getDeclaredMethods();
		for (Method method : declearedMethods) {
			System.out.println("公共方法名 :" + method.getName() + " 返回类型 :" + method.getGenericReturnType());
			for (Parameter params : method.getParameters()) {
				System.out.println("公共方法参数 :" + params.getName() + " 返回类型 :" + params.getType());
			}
		}
		System.out.println("annotation");
		// 所用注解
		Annotation[] annotation = c.getAnnotations();
		for (Annotation anno : annotation) {
			System.out.println("注解 :" + anno.toString());
		}
		// 公告注解
		Annotation[] declearedAnnotation = c.getDeclaredAnnotations();
		for (Annotation a : declearedAnnotation) {
			System.out.println("公告注解 :" + a.toString());
		}
		TypeVariable<?>[] ces = c.getTypeParameters();
		for (TypeVariable<?> typeVariable : ces) {
			System.out.println("泛型:" + typeVariable.getName());
		}
		System.out.println("superClass");
		System.out.println("superClass");
		// 超类(父类和接口)
		Class<?> suc = c.getSuperclass();
		System.out.println("超类:" + suc.getName() + " 类型: " + suc.getTypeName());
		System.out.println("超类属性");
		Field[] superFiles = suc.getFields();
		for (Field field : superFiles) {
			System.out.println("超类属性:" + field.getName());
		}
		System.out.println("超类属性");
		TypeVariable<?>[] classes = suc.getTypeParameters();
		for (TypeVariable<?> typeVariable : classes) {
			System.out.println("超类泛型:" + typeVariable.getName());
		}

		System.out.println("接口");
		Class<?>[] intefs = c.getInterfaces();
		for (Class<?> ints : intefs) {
			System.out.println("接口:" + ints.getName() + " 接口: " + ints.getTypeName());
			for (TypeVariable<?> intsp : ints.getTypeParameters()) {
				System.out.println("接口泛型: " + intsp.getTypeName());
			}
		}

	}

	@Override
	public void getInterface() {
		// TODO Auto-generated method stub

	}

	@Override
	public void getInterface(int over) {
		// TODO Auto-generated method stub

	}
}

class Reflect1<Integer, Byte, Charactor> {
	public String he;
	public String hello4;
}

interface ReIn<Short> {

	static int intefaceNumber = 9;

	void getInterface();

	void getInterface(int over);
}


转载于:https://my.oschina.net/u/2246410/blog/553035

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值