黑马程序员技术交流社区
标题:
关于反射,一般应用于哪些场景呢?
[打印本页]
作者:
〃FelayMan。
时间:
2014-2-9 20:28
标题:
关于反射,一般应用于哪些场景呢?
package com.felay.reflect;
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 FeflectDemo {
/**
* 1.在运行时分析类的能力<br>
* 2.在运行中查看对象<br>
* 3.实现数组的操作代码<br>
* 4.利用Method对象<br>
* 反射是一种功能强大且复杂的机制,使用它的主要对象是工具的构造者,而不是应用程序员<br>
* 能够分析类的能力的程序被成为反射<br>
*/
public static void main(String[] args) {
// 保存要输入的类名
String name ;
System.out.print("请输入您输入的类名:");
Scanner sc = new Scanner(System.in);
name=sc.next();
try {
Class<?> cl = Class.forName(name);
// 获取父类
Class<?> superClass = cl.getSuperclass();
// 获取修饰符
String modifier = Modifier.toString(cl.getModifiers());
if (modifier.length() > 0)
System.out.print(modifier + " ");
// 获取基本类型
System.out.print("class " + cl.getSimpleName());
// 当存在父类的时候就继承于父类
if (superClass != null && superClass != Object.class)
System.out.print(" extends" + superClass.getSimpleName());
System.out.println("\n{\n");
printFileds(cl);
printContractors(cl);
printMethods(cl);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 打印所有构造函数
public static void printContractors(Class<?> cl) {
Constructor<?>[] constructors = cl.getDeclaredConstructors();
System.out.println("的所有构造函数为:");
for (Constructor<?> constructor : constructors) {
String name = constructor.getName();
System.out.print("");
String modifer = Modifier.toString(constructor.getModifiers());
if (modifer.length() > 0)
System.out.print(modifer + " ");
System.out.print(name + "(");
Class<?>[] paraTypes = constructor.getParameterTypes();
for (int i = 0; i < paraTypes.length; i++) {
if (i > 0)
System.out.print(",");
System.out.print(paraTypes[i].getSimpleName());
}
System.out.println(")");
}
}
// 打印所有方法
public static void printMethods(Class<?> cl) {
System.out.println("所有的方法为:");
Method[] methods = cl.getDeclaredMethods();
for (Method method : methods) {
Class<?> retType = method.getReturnType();
String name = method.getName();
System.out.print("");
String modifer = Modifier.toString(method.getModifiers());
if (modifer.length() > 0)
System.out.print(modifer + " ");
System.out.print(retType.getName() + " " + name + "(");
Class<?>[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
if (i > 0)
System.out.print(",");
System.out.print(paramTypes[i].getName());
}
System.out.println(");");
}
}
// 打印所有字段
public static void printFileds(Class<?> cl) {
Field[] fields = cl.getFields();
if (fields.length > 0) {
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i]);
}
}
}
}
学习反射总感觉不知道它该应用于什么地方?有经验的哥哥姐姐能讲一下么?
作者:
zc332750
时间:
2014-2-10 09:49
一般在开发针对java语言相关的开发工具时使用吧,比如你要开发一个新框架(已有spring,你做个summer),另外的人使用你的框架,在运行的同时需要对下游的代码进行一定的分理。
有比如对java运行的监控工具、调试工具、测试工具。方法学上的新编程方式,AOP,Event-driving,建模的新工具等等,对自己代码的监控。
偏Java系统一些的开发。通常的行业应用用的不多。 而且被很多人误用,在没必要用的时候使用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2