java反射的基本概念和简单应用
来源:互联网 发布:淘宝怎样做充值话费 编辑:程序博客网 时间:2024/06/07 06:52
能够分析类能力的程序称为反射。反射可以用来:
1.在运行时分析类的能力
2.在运行时查看对象,例如,编写一个toString方法供所有类使用
3.实现通用的操作代码。例如:通用dao
一般使用它的主要是工具制造者。
下面介绍反射机制最重要的内容—–检查类的结构
在java.lang.reflect包中有三个类Field、Constuctor、Method分别用于描述类的域、构造器和方法。其次,还可以利用Modifier类的静态方法分析getModifiers返回的整型数值。利用Modifier.toString方法来获取修饰符。
下面代码
代码描述:输入任意类的名称,打印出类的结构。
import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.Scanner;public class ReflectDemo { public static void main(String[] args) { try { System.out.println("input className:"); Scanner sc = new Scanner(System.in); String className = sc.next(); Class clazz = Class.forName(className); Class superClass = clazz.getSuperclass();//获取该类的父类 String modifies = Modifier.toString(clazz.getModifiers());//获取修饰符 if (modifies.length() > 0) System.out.print(modifies + " "); System.out.print("class " + className); if (superClass != null && superClass != Object.class) System.out.print(" extends " + superClass.getName()); System.out.print("\n{\n"); printFields(clazz); System.out.println(); printConstructors(clazz); System.out.println(); printMethods(clazz); System.out.print("}"); } catch (Exception e) { e.printStackTrace(); } } // 打印该类的所有的方法 private static void printMethods(Class clazz) { Method[] methods = clazz.getDeclaredMethods();//获取该类的所有方法 for (Method method : methods) { Class<?> type = method.getReturnType(); String name = method.getName(); String modifies = Modifier.toString(method.getModifiers()); System.out.print(" "); if (modifies.length() > 0) System.out.print(modifies + " "); System.out.print(type.getName() + " " + name + "("); Class[] parameterTypes = method.getParameterTypes(); for (int i = 0; i < parameterTypes.length; i++) { if (i > 0) System.out.print(","); System.out.print(parameterTypes[i].getName()); } System.out.println(");"); } } // 打印该类的所有构造方法 private static void printConstructors(Class clazz) { Constructor[] constructors = clazz.getDeclaredConstructors();//获取该类的所有构造器 for (Constructor constructor : constructors) { String name = constructor.getName(); String modifies = Modifier.toString(constructor.getModifiers()); System.out.print(" "); if (modifies.length() > 0) System.out.print(modifies + " "); System.out.print(name + "("); Class[] parameterTypes = constructor.getParameterTypes(); for (int i = 0; i < parameterTypes.length; i++) { if (i > 0) System.out.print(","); System.out.print(parameterTypes[i].getName()); } System.out.println(");"); } } // 打印该类的所有的属性 private static void printFields(Class clazz) { Field[] fields = clazz.getDeclaredFields();//获取该类的所有属性 for (Field field : fields) { Class fieldType = field.getType(); String fieldName = field.getName(); String modifies = Modifier.toString(field.getModifiers()); System.out.print(" "); if (modifies.length() > 0) System.out.print(modifies + " "); System.out.print(fieldType.getName() + " " + fieldName + ";\n"); } }}
例如: 输入:java.lang.Double
输出结果:
public final class java.lang.Double extends java.lang.Number{ public static final double POSITIVE_INFINITY; public static final double NEGATIVE_INFINITY; public static final double NaN; public static final double MAX_VALUE; public static final double MIN_NORMAL; public static final double MIN_VALUE; public static final int MAX_EXPONENT; public static final int MIN_EXPONENT; public static final int SIZE; public static final java.lang.Class TYPE; private final double value; private static final long serialVersionUID; public java.lang.Double(double); public java.lang.Double(java.lang.String); public boolean equals(java.lang.Object); public static java.lang.String toString(double); public java.lang.String toString(); public int hashCode(); public static native long doubleToRawLongBits(double); public static long doubleToLongBits(double); public static native double longBitsToDouble(long); public int compareTo(java.lang.Double); 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.Double valueOf(double); public static java.lang.Double valueOf(java.lang.String); public static java.lang.String toHexString(double); public static int compare(double,double); public static boolean isNaN(double); public boolean isNaN(); public static boolean isInfinite(double); public boolean isInfinite(); public static double parseDouble(java.lang.String);}
阅读全文
0 0
- java反射的基本概念和简单应用
- Java的反射基本概念、语法和应用
- java 反射和注解的简单应用
- java反射的简单应用
- java反射的简单应用
- Java反射的简单应用
- java反射的简单应用
- JAVA反射-反射的基本概念
- 反射之一(静态反射基本概念和应用)
- Java反射-简单应用
- JAVA反射机制的简单应用
- JAVA反射机制的简单应用
- Java反射机制的简单应用
- Java反射机制的简单应用
- java多线程的基本概念和简单操作
- 反射的简单应用
- 反射简单的应用
- 反射的简单应用
- 有关CGI、FastCGI和PHP-fpm的简述
- github 建静态博客
- 如何让你的SQL运行得更快
- 【MD】yum install --downloadonly 下载依赖包、salt离线安装探索
- Android Studio 中的类文件前标识图标显示为 j 而不是C,代码的左边没有了颜色显示,布局文件的引用也没有蓝色显示,代码大部分变成了白色。项目能正常编译运行,且敲代码时也没有了提示的问题
- java反射的基本概念和简单应用
- 蓝桥杯--除去立方数
- 带L1正则化项的近似梯度下降
- 回归分析
- 富文本 简单样式
- QPixmap load jpg图片失败的解决方法
- 潮水退去,是谁在裸泳?
- linux 部分命令总结
- cookie