java——反射机制
java的反射机制也是java中的一个重点,反射机制能够使我们很方便的创建灵活的代码,这些代码可以在运行时装配,可以动态地获取某个对象的类信息以及调用该类的方法。
1. 反射机制的主要作用
通过反射机制访问java对象的属性,方法,构造方法等。通过反射机制,程序是可以访问和修改它本身状态或者行为的
其实反射机制就是类似于一个反编译的过程,可以通过.class文件反编译来获得.java文件中的一些内容
2. java API中和反射相关的包主要是java.lang.reflect。
常用的一些类
Class:代表一个类
Field:代表类的成员变量
Method:代表类的方法
Constructor:代表类的构造方法
常用的方法:
getName():获取类名
getFields():获取类public类型的成员变量
getDeclaredFields():获取类的所有属性
getMethods():获取类的public类型的方法
getDeclaredMethods():获取类的所有方法
getType():成员变量类型 int,long等
getReturnType():获取方法的类型
getConstructors():获得类的public类型的构造方法
getConstructors(Class[] parameterTypes):获取类的特定构造方法,parameterTypes是参数指定的构造方法
3. 在运行时判断一个对象所属的类
try { //第一种方式,这种方式一定要写全类的路径,例如java.lang.Integer,而且要处理异常 Class<?> class1 = Class.forName("baseType.FileCopy"); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //第二种方法,可以直接获取 Class class2 = FileCopy.class;
//第三种方法,先实例化类,然后根据对象来获取 FileCopy fc = new FileCopy(); Class class3 = fc.getClass();
4. 在运行时构造任意一个类的对象
Class class2 = FileCopy.class; try { Object obj = class2.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }
在创建新的对象时,同样注意要抛出异常
5. 在运行时判断任意一个类所具有的成员变量
这里举例获取integer的所有成员变量
public static void main(String[] args) { // TODO Auto-generated method stub try { Class class1 = Class.forName("java.lang.Integer"); Field[] file = class1.getDeclaredFields(); StringBuffer sb = new StringBuffer(); sb.append(Modifier.toString(class1.getModifiers())+" class "+class1.getSimpleName()+"{\n"); for(Field f:file){ sb.append("\t"); sb.append(Modifier.toString(f.getModifiers())+" "); //获得属性的修饰符 sb.append(f.getType().getSimpleName()+" "); //属性类型名 sb.append(f.getName()+";\n"); } sb.append("}"); System.out.println(sb); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
运行结果如下:
public final class Integer{ public static final int MIN_VALUE; public static final int MAX_VALUE; public static final Class TYPE; static final char[] digits; static final char[] DigitTens; static final char[] DigitOnes; static final int[] sizeTable; private final int value; public static final int SIZE; public static final int BYTES; private static final long serialVersionUID; }
6. 在运行是判断一个类的所有方法(当然也可以在运行时调用任意一个方法)
//获取类的所有方法 try { Class class1 = Class.forName("java.lang.Integer"); Method[] method = class1.getDeclaredMethods(); StringBuffer sb = new StringBuffer(); sb.append(Modifier.toString(class1.getModifiers())+" class "+class1.getSimpleName()+"{\n"); for(Method m:method){ sb.append("\t"); sb.append(Modifier.toString(m.getModifiers())+" "); //获得属性的修饰符 sb.append(m.getReturnType().getSimpleName()+" "); //属性类型名 sb.append(m.getName()+";\n"); } sb.append("}"); System.out.println(sb); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
运行结果:
public final class Integer{ public static int numberOfLeadingZeros; public static int numberOfTrailingZeros; public static int bitCount; public boolean equals; public static String toString; public String toString; public static String toString; public static int hashCode; public int hashCode; public static int min; public static int max; public static int reverseBytes; public int compareTo; public volatile int compareTo; public byte byteValue; public short shortValue; public int intValue; public long longValue; public float floatValue; public double doubleValue; public static Integer valueOf; public static Integer valueOf; public static Integer valueOf; public static String toHexString; public static int compare; public static Integer decode; static void getChars; public static int reverse; static int stringSize; public static int sum; public static int parseInt; public static int parseInt; public static long toUnsignedLong; public static int compareUnsigned; public static int divideUnsigned; static int formatUnsignedInt; public static Integer getInteger; public static Integer getInteger; public static Integer getInteger; public static int highestOneBit; public static int lowestOneBit; public static int parseUnsignedInt; public static int parseUnsignedInt; public static int remainderUnsigned; public static int rotateLeft; public static int rotateRight; public static int signum; public static String toBinaryString; public static String toOctalString; public static String toUnsignedString; public static String toUnsignedString; private static String toUnsignedString0; }