版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012447842/article/details/84954223
主要学习《java核心技术》, 用以记录, 怕以后遗忘。
java.lang.reflect包中有三个类Field,Method, Constructor分别用于描述类的域,方法和构造器。这三个类都有一个叫做getName的方法, 用于放回项目的名称。
优秀博客者: https://blog.csdn.net/sinat_38259539/article/details/71799078
import java.util.*;
import java.lang.reflect.*;
/**
* java核心技术 5.7.3 利用反射分析类的能力
*/
public class ReflectionTest {
public static void main(String[] args)
{
String name;
if(args.length > 0){
name = args[0];
}
else{
// Scanner in = new Scanner(System.in);
// System.out.println("Enter class name(e.g java.util.Date): ");
// name = in.next();
name = "java.lang.Double";
}
try{
Class cl = Class.forName(name); // 将字符串转化成对象
Class supercl = cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if (modifiers.length() > 0) System.out.println(modifiers + "");
System.out.println("class " + name);
if (supercl != null && supercl != Object.class) System.out.println("extends " + supercl.getName()); // 获取超类
System.out.print("\n{\n");
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.println();
printFields(cl);
System.out.println("}");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
System.exit(0);
}
/**
* 打印类的构造器
* @param cl
*/
public static void printConstructors(Class cl)
{
Constructor[] constructors = cl.getDeclaredConstructors(); // 获取类中声明的构造器
for(Constructor c: constructors)
{
String name = c.getName();
System.out.print("1 ");
String modifiers = Modifier.toString(c.getModifiers()); // c.getModifiers 返回一个整型数值, 用不同的位开关描述public和static的使用情况
if(modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.print(name + "(");
Class[] paramTypes = c.getParameterTypes();
for (int j = 0; j < paramTypes.length; j++)
{
if ( j > 0) System.out.println(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printMethods(Class cl)
{
Method[] methods = cl.getDeclaredMethods(); //获取类中声明的全部方法
for (Method m: methods)
{
Class retType = m.getReturnType();
String name = m.getName();
System.out.print("2 ");
String modifiers = Modifier.toString(m.getModifiers());
if(modifiers.length() > 0) System.out.print(modifiers + " "); //eg: public 或 public static d等
System.out.print(retType.getName() + " " + name + "(");
Class[] paramTypes = m.getParameterTypes();
for(int j = 0; j < paramTypes.length; j++)
{
if (j > 0) System.out.print(", ");
System.out.print(paramTypes[j].getName());
}
System.out.println(");");
}
}
public static void printFields(Class cl)
{
Field[] fields = cl.getDeclaredFields(); // 获取类中声明的全部域
for ( Field f: fields)
{
Class type = f.getType();
String name = f.getName();
System.out.print("3 ");
String modifiers = Modifier.toString(f.getModifiers());
if (modifiers.length() > 0) System.out.print(modifiers + " ");
System.out.println(type.getName() + " " + name + " ");
}
}
}
执行后放回的结果:
"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" "-javaagent:D:\Program
public final
class java.lang.Double
extends java.lang.Number
{
1 public java.lang.Double(double);
1 public java.lang.Double(java.lang.String);
2 public boolean equals(java.lang.Object);
2 public static java.lang.String toString(double);
2 public java.lang.String toString();
2 public int hashCode();
2 public static int hashCode(double);
2 public static double min(double, double);
2 public static double max(double, double);
2 public static native long doubleToRawLongBits(double);
2 public static long doubleToLongBits(double);
2 public static native double longBitsToDouble(long);
2 public volatile int compareTo(java.lang.Object);
2 public int compareTo(java.lang.Double);
2 public byte byteValue();
2 public short shortValue();
2 public int intValue();
2 public long longValue();
2 public float floatValue();
2 public double doubleValue();
2 public static java.lang.Double valueOf(java.lang.String);
2 public static java.lang.Double valueOf(double);
2 public static java.lang.String toHexString(double);
2 public static int compare(double, double);
2 public static boolean isNaN(double);
2 public boolean isNaN();
2 public static boolean isFinite(double);
2 public static boolean isInfinite(double);
2 public boolean isInfinite();
2 public static double sum(double, double);
2 public static double parseDouble(java.lang.String);
3 public static final double POSITIVE_INFINITY
3 public static final double NEGATIVE_INFINITY
3 public static final double NaN
3 public static final double MAX_VALUE
3 public static final double MIN_NORMAL
3 public static final double MIN_VALUE
3 public static final int MAX_EXPONENT
3 public static final int MIN_EXPONENT
3 public static final int SIZE
3 public static final int BYTES
3 public static final java.lang.Class TYPE
3 private final double value
3 private static final long serialVersionUID
}
Process finished with exit code 0