Java 反射学习
来源:互联网 发布:mac pro是做什么用的 编辑:程序博客网 时间:2024/05/17 08:21
最近在看《java 核心技术》基础篇中,看到了反射一节。记录下,待后续参考复习;
1、 在java.lang.reflect包中有三个类Field、 Method和Constructor分别用于描述类的域、方法和构造器。这三个类都有一个叫做getName的方法,用来返回项目的名称。
Field类有一个getType方法,用来返回描述域所属类型的Class对象。 Method和Constructor类有能够报告参数类型的方法, Method类还有一个可以报告返回类型的方法。这三个类还有一个叫做getModifiers的方法,它将返回一个整型数值,用不同的位开关描述public和static这样的修饰符使用状况。
另外,还可以利用java.lang.reflect包中的Modifier类的静态方法分析getModifiers返回的整型数值。例如,可以使用Modifier类中的isPublic、 isPrivate或isFinal判断方法或构造器是否是public、 private或final。我们需要做的全部工作就是调用Modifier类的相应方法,并对返回的整型数值进行分析,另外,还可以利用Modifier.toString方法将修饰法打印出来。
Class类中的getFields、 getMethods和getConstructors方法将分别返回类提供的public域、方
法和构造器数组,其中包括超类的公有成员。 Class类的getDeclareFields、 getDeclareMethods和
getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受
保护成员,但不包括超类的成员。
例子:
输入:类名称
输出:类的构造器、方法、属性
/** * @Author: YLBG-YCY-1325 * @Description: 反射 * @Date: 2017/3/31 */public class ReflectionTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入类的全称(e.g. java.util.Date):"); String className = scanner.next(); try { Class cls = Class.forName(className); Class superClass = cls.getSuperclass(); String modifier = Modifier.toString(cls.getModifiers()); // 获取类前面的修饰符 if (modifier.length() > 0) { System.out.printf(modifier + " "); } System.out.printf("class" + className); // 超类继承 if (null != superClass && superClass != Object.class) { System.out.printf(" extends " + superClass.getName()); } System.out.printf("\n{\n"); printFileds(cls); System.out.println(); printContructors(cls); System.out.println(); printMethods(cls); System.out.println("}"); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } /** * 打印类的所有构造器 * @param cls 反射类 */ public static void printContructors(Class cls) { Constructor[] constructors = cls.getConstructors(); for (Constructor constructor : constructors) { String modifier = Modifier.toString(constructor.getModifiers()); if (modifier.length()>0){ System.out.printf(modifier+" "); } System.out.printf(constructor.getName()+"("); Class[] paramsType = constructor.getParameterTypes(); for (int j=0;j<paramsType.length;j++){ if (j>0){ System.out.printf(","); } System.out.printf(paramsType[j].getName()); } System.out.printf(");\n"); } } /** * 打印所有方法 * @param cls 反射类 */ public static void printMethods(Class cls){ Method[] methods = cls.getMethods(); for (Method method:methods){ String modifier = Modifier.toString(method.getModifiers()); if (modifier.length()>0){ System.out.printf(modifier+" "); } //获取返回类型 Class returnType = method.getReturnType(); System.out.printf(returnType.getName()+" "); System.out.printf(method.getName()+"("); //获取参数类型 Class[] paramType = method.getParameterTypes(); for (int i=0;i<paramType.length;i++){ if (i>0){ System.out.printf(","); } System.out.printf(paramType[i].getName()); } System.out.printf(");\n"); } } /** * 打印类的所有属性 * @param cls 反射类 */ private static void printFileds(Class cls){ Field[] fields = cls.getDeclaredFields(); for (Field field:fields){ String modifier = Modifier.toString(field.getModifiers()); Class fieldType = field.getType(); if (modifier.length()>0){ System.out.printf(modifier + " "); } System.out.printf(fieldType+" "); System.out.printf(field.getName()+";\n"); } }}
上面,程序运行结果:
输入类的全称(e.g. java.util.Date):java.lang.Integerpublic final classjava.lang.Integer extends java.lang.Number{public static final int MIN_VALUE;public static final int MAX_VALUE;public static final class java.lang.Class TYPE;static final class [C digits;static final class [C DigitTens;static final class [C DigitOnes;static final class [I sizeTable;private final int value;public static final int SIZE;public static final int BYTES;private static final long serialVersionUID;public java.lang.Integer(int);public java.lang.Integer(java.lang.String);public static int numberOfLeadingZeros(int);public static int numberOfTrailingZeros(int);public static int bitCount(int);public boolean equals(java.lang.Object);public static java.lang.String toString(int,int);public java.lang.String toString();public static java.lang.String toString(int);public static int hashCode(int);public int hashCode();public static int min(int,int);public static int max(int,int);public static int reverseBytes(int);public int compareTo(java.lang.Integer);public volatile int compareTo(java.lang.Object);public byte byteValue();public short shortValue();public int intValue();public long longValue();public float floatValue();public double doubleValue();public static java.lang.Integer valueOf(java.lang.String,int);public static java.lang.Integer valueOf(int);public static java.lang.Integer valueOf(java.lang.String);public static java.lang.String toHexString(int);public static int compare(int,int);public static java.lang.Integer decode(java.lang.String);public static int reverse(int);public static int sum(int,int);public static int parseInt(java.lang.String);public static int parseInt(java.lang.String,int);public static long toUnsignedLong(int);public static int compareUnsigned(int,int);public static int divideUnsigned(int,int);public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);public static java.lang.Integer getInteger(java.lang.String,int);public static java.lang.Integer getInteger(java.lang.String);public static int highestOneBit(int);public static int lowestOneBit(int);public static int parseUnsignedInt(java.lang.String);public static int parseUnsignedInt(java.lang.String,int);public static int remainderUnsigned(int,int);public static int rotateLeft(int,int);public static int rotateRight(int,int);public static int signum(int);public static java.lang.String toBinaryString(int);public static java.lang.String toOctalString(int);public static java.lang.String toUnsignedString(int);public static java.lang.String toUnsignedString(int,int);public final void wait();public final void wait(long,int);public final native void wait(long);public final native java.lang.Class getClass();public final native void notify();public final native void notifyAll();}
- java学习-反射
- Java反射学习
- Java反射学习
- java反射机制学习
- Java反射学习
- Java反射学习
- JAVA反射机制学习
- Java 反射 视频学习
- java反射的学习
- Java学习日志-反射
- java 反射基础学习
- Java反射学习
- java 反射学习
- JAVA 反射学习总结
- java 的反射学习
- Java反射学习
- Java反射机制学习
- JAVA反射机制学习
- iOS 项目行数统计
- 深入理解C++中变量的存储类别和属性
- 断点的设置方法
- 代理模式
- Android实现计算器布局(四种布局方式)之TableLayout表格布局
- Java 反射学习
- Swift3废除特性(一)
- JAVA-1.2-注释、关键字、标识符、进制等
- 【LeetCode】Gas Station 解题报告
- 冒泡排序
- 国产“芯”时代 盘点国内十大IC卡制卡企业
- Apache curator-client详解
- Check failed: error == cudaSuccess (8 vs. 0) invalid device function
- 使用intellij的svn时提示出错: Can't use Subversion command line client: svn.Errors found while svn working co