您的位置:首页 > 编程语言 > Java开发

java反射的基本概念和简单应用

2017-12-04 17:11 495 查看
能够分析类能力的程序称为反射。反射可以用来:

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.l
4000
ength() > 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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反射 java 反射机制