Java反射实例

来源:互联网 发布:ubuntu16.04 caffe gpu 编辑:程序博客网 时间:2024/06/01 10:34

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

通过一个例子来进行基本的操作:

package com.znn.reflect;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {Class<?> clazz = Class.forName("com.znn.reflect.Persion");//获取类的包名和类名String fullName = "包名:"+clazz.getPackage().getName()+" 类名"+clazz.getName();System.out.println(fullName);//创建类对象 必须提供无参构造方法 也可以使用getConstructions()获取所有构造函数Persion persion = (Persion) clazz.newInstance();persion.setName("zhangningning");persion.setAge(20);System.out.println("创建类实例对象:"+persion);//获取成员变量Field nameField = clazz.getDeclaredField("name");//获取所有的成员字段 getField(String name)是获取公共的nameField.setAccessible(true);nameField.set(persion, "znn");System.out.println("设置私有的成员变量:"+persion);//获取并设置静态变量Field tagField = clazz.getField("TAG");tagField.set(null, tagField.get(null)+" Modify...");System.out.println("设置私有的静态变量:"+persion);//获取父类 getGenericSuperclass() 表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。Class<?> superClass = clazz.getSuperclass();System.out.println("父类:"+superClass);//获取所有的成员Field field[] = clazz.getDeclaredFields();System.out.println("\n所有成员:");for (int i = 0; i < field.length; i++) {System.out.println(field[i]);}//获取所有方法System.out.println("\n所有方法:");Method method[] = clazz.getDeclaredMethods();for (int i = 0; i < method.length; i++) {System.out.println(method[i]);}//执行静态方法System.out.println("\n执行静态方法:");Method m1 = clazz.getMethod("printTag", null);m1.invoke(null, null);//执行私有实例方法System.out.println("\n执行私有实例方法:");Method m3 = clazz.getDeclaredMethod("getBornYear", String.class);m3.setAccessible(true);Integer year = (Integer) m3.invoke(persion, "PARA");System.out.println("BIRTH="+year);//执行公共实例方法System.out.println("执行公共实例方法");Method m4 = clazz.getMethod("sayHi", null);m4.invoke(persion, null);}}

http://115.28.189.59/?p=106

1 0
原创粉丝点击