Reflection反射
=================================================================================
【概念】:
1、Java反射的概念
反射含义:可以获取正在运行的Java对象。
2、Java反射的功能
1)可以判断运行时对象所属的类
2)可以判断运行时对象所具有的成员变量和方法
3)通过反射甚至可以调用到private的方法
4)生成动态代理
=======================================================================================
【有什么用】:
举一个简单的例子:
我们在eclipse新建一个类及其方法属性时,下面调用对象方法以及属性时,直接一个点,就会给我们列出它所有的类和方法,这就是利用了java的反射机制。对一个类的自审,
现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。
【一个准女婿要见未婚妻家人的故事引出】:
譬如 A a=new A();
a.put(2);
这个是在编译阶段完成对a类型的解析,对a是不是有put方法进行了判断,如果a对象没有put方法,则编译不通过。
可是有的时候我们需要在运行的时候动态地对一个对象的指定方法进行调用,我不想写的那么死,在编译的时候就写就好像小明想和小红家庭中的哪个人聊天都没有确定我怎么能直接把小明和小红爸爸绑在一起呢,让程序在运行时候更有主动性,更能变通和迎接外来挑战。这时候我想写一个通用函数,传入一个对象,可以是小红爸爸,小红妈妈,可以是小红,把这个对象属性名,属性值,都输出反映给小明知道,小明才知道怎么更好的跟小红家庭成员交谈,在了解了他们兴趣爱好之后。
反射含义:可以获取正在运行的Java对象。
=======================================================================================
【JDK支持】:
JDK1.5以后引入,JDK1.4以及以前版本不支持。
=======================================================================================
【怎么用】:
实现Java反射的类
1)Class:它表示正在运行的Java应用程序中的类和接口
2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
4)Method:提供关于类或接口中某个方法信息
【重点】:其中Class类很重要。官方解释一大串,然而看后并不懂什么鬼,对程序员最好的语言就是代码
转:疯狂java
public static void test01() throws ClassNotFoundException { Class c1 = TestReflection.class; Class c2 = Class.forName("com.reflection.TestReflection"); //获取指定的包名 String package01 = c1.getPackage().getName(); String package02 = c2.getPackage().getName(); System.out.println("package01 = " + package01); System.out.println("package02 = " + package02); //获取类的修饰符 int mod = c1.getModifiers(); String modifier = Modifier.toString(mod); System.out.println("modifier = " + modifier); //获取指定类的完全限定名 String className = c1.getName(); System.out.println("className = " + className); //获取指定类的父类 Class superClazz = c1.getSuperclass(); String superClazzName = superClazz.getName(); System.out.println("superClazzName = " + superClazzName); //获取实现的接口 Class[] interfaces = c1.getInterfaces(); for (Class t : interfaces) { System.out.println("interfacesName = " + t.getName()); } //获取指定类的成员变量 Field[] fields = c1.getDeclaredFields(); for (Field field : fields) { modifier = Modifier.toString(field.getModifiers()); //获取每个 字段的访问修饰符 Class type = field.getType(); //获取字段的数据类型所对应的 Class对象 String name = field.getName(); //获取字段名 if (type.isArray()) { //如果是数组类型则需要特别处理 String arrType = type.getComponentType().getName() + "[]"; System.out.println("" + modifier + " " + arrType + " " + name + ";"); } else { System.out.println("" + modifier + " " + type + " " + name + ";"); } } //获取类的构造方法 Constructor[] constructors = c1.getDeclaredConstructors(); for (Constructor constructor : constructors) { String name = constructor.getName(); //构造方法名 modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符 System.out.println("" + modifier +" " + name + "("); Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数 for (int i = 0; i < paramTypes.length; i++) { if (i > 0) { System.out.print(","); } if (paramTypes[i].isArray()) { System.out.println(paramTypes [i].getComponentType().getName()+"[]"); } else { System.out.print(paramTypes[i].getName()); } } System.out.println(");"); } //获取成员方法 Method[] methods = c1.getDeclaredMethods(); for (Method method: methods) { modifier = Modifier.toString(method.getModifiers()); Class returnType = method.getReturnType(); //获取方法的返回类型 if (returnType.isArray()) { String arrType = returnType.getComponentType ().getName()+"[]"; System.out.print(""+modifier+" " + arrType + " " + method.getName() + "("); } else { System.out.print("" + modifier + " " + returnType.getName() + " " + method.getName() + "("); } Class[] paramTypes = method.getParameterTypes(); for (int i = 0; i < paramTypes.length; i++) { if (i > 0) { System.out.print(","); } if (paramTypes[i].isArray()) { System.out.println(paramTypes [i].getComponentType().getName()+"[]"); } else { System.out.print(paramTypes[i].getName()); } } System.out.println(");"); }
https://www.douban.com/note/306848299/
这个网址各种用法写的非常详细,大家可以去看一下。基本涵盖反射机制在代码中的方法实例
相关推荐
- **技术衍生**:这一阶段衍生出了一些关键的技术,如从ZIP包中加载类,这是JAR、WAR和EAR文件的基础;或者通过网络加载类,例如Applet的实现;以及通过运行时计算生成类,比如`java.lang.reflect.Proxy`中动态生成...
由于C++没有内置的反射机制,不能像Java那样在运行时动态地识别和创建类的实例。因此,在C++中使用工厂模式时,需要手动实现一些类似于反射的功能。一种常见的做法是定义一个工厂函数,它根据传入的类名字符串来创建...
8. **属性与元数据**:C#的属性提供了访问字段的安全方式,而元数据则允许通过反射获取程序集和类型的详细信息,这对于实现自描述和插件架构非常有用。 9. **异常处理**:通过try-catch-finally语句,C#提供了一种...
PADS Router:手工交互式布线模块,可以对复杂的PCB 使用交互式布线功能,支持自动连接、布线路径规划、布线形状优化、动态布线、布线推挤/过孔推挤、布线居中、自动调整线宽等功能; 需要说明的是:在PADS9.0中...
15. 激素化学本质:甲状腺激素是含碘的氨基酸衍生物,生长激素是蛋白质类激素,这两者都参与人体生长和代谢的调节。 以上是对题目中涉及的生物学知识点的详细解析,涵盖了内环境、体温调节、渗透压平衡、激素调节、...
在静态电荷分布的基础上,动态电荷行为的研究更为复杂。电流、电阻和欧姆定律构成了电路理论的基础。电流的产生与电荷的定向移动相关,而电阻则是阻碍电流流动的性质。欧姆定律阐述了电流、电压和电阻之间的关系,是...
5. **衍生(Derive)与定制派生** `derive`关键字可以方便地自动生成常见的trait实现,如`Debug`、`Clone`和`Eq`。然而,Rust还支持通过`proc_macro_derive`进行定制派生,允许开发者创建自己的派生宏,以满足更...
Java提供了`Math`类,它包含了一些静态方法来执行常见的数学计算,例如求平方根、最大值和最小值等。 ##### 随机数类 `java.util.Random`类用于生成伪随机数。通过创建一个`Random`对象,可以生成随机的整数、...