Java 枚举 与反射

枚举

  • enum和class、interface的地位一样
  • 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
  • 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
  • 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
  • 枚举类的构造器只能是私有的。
package com.zhm;

 enum Color {
    RED ,YELLOW,BLANK;
}
package com.zhm;

public class enumTest {
	public void IsTrue(Color RED){
		switch(RED.compareTo(Color.RED)){
		case -1:
			System.out.print("前");
			break;
		case 1:
			System.out.print("后");
			break;
		default:
			System.out.print("等于");
			break;
		}
	}
	public static void main(String args[]){
		enumTest t=new enumTest();
		
		t.IsTrue(Color.YELLOW);
	}
}

反射

反射实在程序运行时动态获取类的信息,如成员变量,成员方法,构造方法,注释等。

假如你不知道一个类的内部信息 可以通过反射获取

能获取到的

类的修饰符,名字,注解
构造方法修饰符,名字,参数,声明的异常,注解
方法的修饰符,返回值,名字,参数,异常,注解
成员变量的修饰符,类型,名字,值
方法体内容获取不到
注释获取不到

package com.zhm;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;

public class ReflectTest {

	public static void main(String[] args) throws ClassNotFoundException {
		// java中有三种方式获取Class类,对象是对类的实例化,虚拟机中的类是对Class的实例化,Class用来描述某一个类的信息,如有哪些成员变量,构造方法,成员方法等
		// Class cls=String.class;
		// Class cls="".getClass();
		Class cls = Class.forName("java.lang.String");

		// 可以通过反射调用object的方法包括private修饰的方法,获取object的成员变量,包括private修饰的成员变量
		Object object = "hello world";

		System.out.println("开始打印"+cls.getTypeName()+"类的内部信息...");
		
		// Class中有四种获取成员变量的方法,分别是
		// getFields() 获取定义的public修饰的成员变量,包括父类定义的成员变量
		// getField(String name) 根据成员变量名称获取public修饰的成员变量,包括父类定义的成员变量
		// getDeclaredFields() 获取某一个类定义的所有成员变量信息(不包括父类的成员变量)
		// getDeclaredField(String name) 根据成员变量名称获取某一个类的成员变量信息
		printDeclaredFields(cls, object);

		// Class中有四种获取构造方法信息的方法,分别是
		// cls.getConstructors() 获取定义的public修饰的构造方法,包括父类定义的构造方法
		// cls.getConstructor(Class... parameterTypes)
		// 根据构造方法参数类型获取定义的public修饰的构造方法,包括父类定义的构造方法
		// cls.getDeclaredConstructors() 获取某一个类定义的所有构造方法,不包括父类定义的构造方法
		// cls.getDeclaredConstructor(Class... parameterTypes)
		// 根据构造方法参数类型获取某一个类定义的所有构造方法,不包括父类定义的构造方法
		printConstrucors(cls);

		// Class中有四种获取方法信息的方法,分别是
		// cls.getMethod(String name, Class... parameterTypes)
		// 根据方法名称和参数类型获取定义的public修饰的方法,包括父类定义的方法
		// cls.getMethods() 获取定义的public修饰的方法,包括父类定义的方法
		// cls.getDeclaredMethod(Stringname, Class... parameterTypes)
		// 根据参数名称和参数类型获取某一个类定义的所有方法,不包括父类定义的方法
		// cls.getDeclaredMethods() 获取某一个类定义的所有方法,不包括父类定义的方法
		printMethods(cls);

	}

	/**
	 * 打印某一个类定义的所有成员变量信息(不包括父类的成员变量)
	 * 
	 * @param cls
	 *            实例化对象对应的的Class
	 * @param object
	 *            某一个实例化对象
	 */
	public static void printDeclaredFields(Class cls, Object object) {
		System.out.println("\n开始打印成员变量信息...");
		// 获取定义的所有成员变量,Field类表示某一个类的成员变量
		Field[] fields = cls.getDeclaredFields();
		for (Field field : fields) {
			// 修饰符的字符串表示
			String modifyName = Modifier.toString(field.getModifiers());
			// 成员变量名称
			String fildName = field.getName();
			// 使用field.get方法获取成员变量信息,如果成员变量使用private修饰,必须先设置为可访问,否则调用field.get将抛出异常
			field.setAccessible(true);
			Object value = null;
			try {
				value = field.get(object);
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			System.out.println(modifyName + " " + fildName + " = " + String.valueOf(value) + ";");
		}
	}

	/**
	 * 打印构造方法
	 * 
	 * @param cls
	 */
	public static void printConstrucors(Class cls) {

		System.out.println("\n开始打印构造方法信息...");
		// Constructor类表示类的构造方法
		Constructor[] constructors = cls.getDeclaredConstructors();
		for (Constructor constructor : constructors) {

			// 可以通过cls.newInstance()调用无参构造方式实例化一个对象,不再演示
			// cls.newInstance()
			// 可以通过constructor.newInstance方法实例化一个对象,不再演示
			// constructor.newInstance(Object... initArgs);

			StringBuilder stringBuilder = new StringBuilder();
			// 访问权限修饰符
			String modifierName = Modifier.toString(constructor.getModifiers());
			if (modifierName != null && modifierName.length() > 0) {
				stringBuilder.append(modifierName + " ");
			}
			// 构造方法名称
			String name = constructor.getName();
			stringBuilder.append(name + "(");
			// 构造方法参数列表
			Class[] paramCls = constructor.getParameterTypes();
			if (paramCls != null && paramCls.length > 0) {
				for (int i = 0; i < paramCls.length; i++) {
					// 获取构造方法参数类型名称
					String paramType = paramCls[i].getTypeName();
					if (i > 0) {
						stringBuilder.append("," + paramType);
					} else {
						stringBuilder.append(paramType);
					}
				}
				stringBuilder.append(") ");
			} else {
				stringBuilder.append(") ");
			}
			// 获取构造方法抛出的异常信息
			Class[] exceptionCls = constructor.getExceptionTypes();
			if (exceptionCls != null && exceptionCls.length > 0) {
				stringBuilder.append("throws ");
				for (int i = 0; i < exceptionCls.length; i++) {
					String exceptionName = exceptionCls[i].getTypeName();
					if (i > 0) {
						stringBuilder.append("," + exceptionName);
					} else {
						stringBuilder.append(exceptionName);
					}
				}
			}
			System.out.println(stringBuilder.toString());
		}

	}

	/**
	 * 打印类的方法信息
	 * 
	 * @param cls
	 */
	public static void printMethods(Class cls) {
		System.out.println("\n开始打印方法信息...");
		// 获取类定义的所有方法,不包括父类定义的方法
		Method[] methods = cls.getDeclaredMethods();
		if (methods != null) {
			for (Method method : methods) {
				
				// 可以通过method.invoke方法调用对象的方法,包括private修饰的方法,不再演示
				// method.invoke(Object obj, Objecect... args)
				
				StringBuilder stringBuilder = new StringBuilder();
				// 访问权限修饰符
				String modifierName = Modifier.toString(method.getModifiers());
				if (modifierName != null && modifierName.length() > 0) {
					stringBuilder.append(modifierName + " ");
				}
				// 获取返回类型信息
				Class returnCls = method.getReturnType();
				stringBuilder.append(returnCls.getTypeName());
				// 方法名称
				String name = method.getName();
				stringBuilder.append(name + "(");
				// 方法参数列表
				Class[] paramCls = method.getParameterTypes();
				if (paramCls != null && paramCls.length > 0) {
					for (int i = 0; i < paramCls.length; i++) {
						// 获取构造方法参数类型名称
						String paramType = paramCls[i].getTypeName();
						if (i > 0) {
							stringBuilder.append("," + paramType);
						} else {
							stringBuilder.append(paramType);
						}
					}
					stringBuilder.append(") ");
				} else {
					stringBuilder.append(") ");
				}
				// 获取方法抛出的异常信息
				Class[] exceptionCls = method.getExceptionTypes();
				if (exceptionCls != null && exceptionCls.length > 0) {
					stringBuilder.append("throws ");
					for (int i = 0; i < exceptionCls.length; i++) {
						String exceptionName = exceptionCls[i].getTypeName();
						if (i > 0) {
							stringBuilder.append("," + exceptionName);
						} else {
							stringBuilder.append(exceptionName);
						}
					}
				}
				System.out.println(stringBuilder.toString());
			}
		}
	}
}

 

开始打印java.lang.String类的内部信息...

开始打印成员变量信息...
private final value = [C@4e25154f;
private hash = 0;
private static final serialVersionUID = -6849794470754667710;
private static final serialPersistentFields = [Ljava.io.ObjectStreamField;@5c647e05;
public static final CASE_INSENSITIVE_ORDER = java.lang.String$CaseInsensitiveComparator@33909752;

开始打印构造方法信息...
public java.lang.String(byte[],int,int) 
public java.lang.String(byte[],java.nio.charset.Charset) 
public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int,int,java.nio.charset.Charset) 
public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
java.lang.String(char[],boolean) 
public java.lang.String(java.lang.StringBuilder) 
public java.lang.String(java.lang.StringBuffer) 
public java.lang.String(byte[]) 
public java.lang.String(int[],int,int) 
public java.lang.String() 
public java.lang.String(char[]) 
public java.lang.String(java.lang.String) 
public java.lang.String(char[],int,int) 
public java.lang.String(byte[],int) 
public java.lang.String(byte[],int,int,int) 

开始打印方法信息...
public boolean equals(java.lang.Object) 
public java.lang.String toString() 
public int hashCode() 
public int compareTo(java.lang.String) 
public volatile int compareTo(java.lang.Object) 
public int indexOf(java.lang.String,int) 
public int indexOf(java.lang.String) 
public int indexOf(int,int) 
public int indexOf(int) 
static int indexOf(char[],int,int,char[],int,int,int) 
static int indexOf(char[],int,int,java.lang.String,int) 
public static java.lang.String valueOf(int) 
public static java.lang.String valueOf(long) 
public static java.lang.String valueOf(float) 
public static java.lang.String valueOf(boolean) 
public static java.lang.String valueOf(char[]) 
public static java.lang.String valueOf(char[],int,int) 
public static java.lang.String valueOf(java.lang.Object) 
public static java.lang.String valueOf(char) 
public static java.lang.String valueOf(double) 
public char charAt(int) 
private static void checkBounds(byte[],int,int) 
public int codePointAt(int) 
public int codePointBefore(int) 
public int codePointCount(int,int) 
public int compareToIgnoreCase(java.lang.String) 
public java.lang.String concat(java.lang.String) 
public boolean contains(java.lang.CharSequence) 
public boolean contentEquals(java.lang.CharSequence) 
public boolean contentEquals(java.lang.StringBuffer) 
public static java.lang.String copyValueOf(char[]) 
public static java.lang.String copyValueOf(char[],int,int) 
public boolean endsWith(java.lang.String) 
public boolean equalsIgnoreCase(java.lang.String) 
public static transient java.lang.String format(java.util.Locale,java.lang.String,java.lang.Object[]) 
public static transient java.lang.String format(java.lang.String,java.lang.Object[]) 
public void getBytes(int,int,byte[],int) 
public byte[] getBytes(java.nio.charset.Charset) 
public byte[] getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public byte[] getBytes() 
public void getChars(int,int,char[],int) 
void getChars(char[],int) 
private int indexOfSupplementary(int,int) 
public native java.lang.String intern() 
public boolean isEmpty() 
public static transient java.lang.String join(java.lang.CharSequence,java.lang.CharSequence[]) 
public static java.lang.String join(java.lang.CharSequence,java.lang.Iterable) 
public int lastIndexOf(int) 
public int lastIndexOf(java.lang.String) 
static int lastIndexOf(char[],int,int,java.lang.String,int) 
public int lastIndexOf(java.lang.String,int) 
public int lastIndexOf(int,int) 
static int lastIndexOf(char[],int,int,char[],int,int,int) 
private int lastIndexOfSupplementary(int,int) 
public int length() 
public boolean matches(java.lang.String) 
private boolean nonSyncContentEquals(java.lang.AbstractStringBuilder) 
public int offsetByCodePoints(int,int) 
public boolean regionMatches(int,java.lang.String,int,int) 
public boolean regionMatches(boolean,int,java.lang.String,int,int) 
public java.lang.String replace(char,char) 
public java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence) 
public java.lang.String replaceAll(java.lang.String,java.lang.String) 
public java.lang.String replaceFirst(java.lang.String,java.lang.String) 
public java.lang.String[] split(java.lang.String) 
public java.lang.String[] split(java.lang.String,int) 
public boolean startsWith(java.lang.String,int) 
public boolean startsWith(java.lang.String) 
public java.lang.CharSequence subSequence(int,int) 
public java.lang.String substring(int) 
public java.lang.String substring(int,int) 
public char[] toCharArray() 
public java.lang.String toLowerCase(java.util.Locale) 
public java.lang.String toLowerCase() 
public java.lang.String toUpperCase() 
public java.lang.String toUpperCase(java.util.Locale) 
public java.lang.String trim() 

 

你可能感兴趣的:(Java 枚举 与反射)