java基礎之反射

JAVA 反射

一. 概述

    1.1 簡述

        反射是java的高級特性,充分利用了JVM的解釋機制。和泛型、註解構成了Java最獨特的特性,出現了各類增長代碼複用的設計思想,直接致使java生態圈豐富框架的出現,其中最出名的是IOC思想的spring。使用的.java文件在編譯器編譯後成 .class 字節碼。而後在classloader的時候會將.class 文件加載並解析到永久區,並在運行時調用class類的方法。java

    1.2 java相關類

        a) java.lang.Class:所用的反射的基礎,class在建立的時候都是存放在該類下面,從而JVM能夠在運行時使用,操做類的數據。spring

        b) java.lang.reflect.*:class每個部分的組成都在這個包。例如:構造器、屬性框架

    1.3 class使用:

        a)組成:訪問修飾符、類型、超類、接口、泛型類型、屬性、方法、註解ide

        b)全部超類、接口、類以及實例都是class的子類(在內存中,全部的class內容,除去邏輯代碼部分,都是掛載在java.lang.class上面)。spa

二.實例

/**
 * @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);
}
相關文章
相關標籤/搜索