[黑马程序员]10高新技术 - 反射
来源:互联网 发布:使命召唤10画面优化 编辑:程序博客网 时间:2024/05/21 08:38
——- android培训、java培训、期待与您交流! ———-
反射
能够对类进行剖析,分析类能力的程序,称为反射。
此类程序的建立需要先获得Class类
Class类
1.Class表示一个对象的属性,
是对Java类的描述,包括:类名, 类所属的包名, 字段名称列表, 方法列表.... 将这些属性封装再成一个类,类名就叫:Class
2.获得Class对象的三种方式
a. getclass()方法 Dog d = new Dog(); Class cls = d.getclass(); //getclass()是object类中的方法。 b.任何数据类型都有一个静态的class属性。可以通过这个属性获得Class对象 Class cls = Person.class //类名.class c.将类名全称作为实际参数传入到Class类中的静态方法forName()中。 String className = "java.util.Date"; Class cls = Class.forName(className); Java中有9个预定义的Class对象: byte, short , int, long, float, double, char, boolean和void.
3.Class类中的方法
需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:
Class.forName(classname) 用于做类加载
obj.getClass() 用于获得对象的类型
类名.class 用于获得指定的类型,传参用
反射类的成员方法:
Class clazz = Person.class;
Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
反射类的构造函数:
Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,…})
con.newInstance(params…)
反射类的属性:
Field field = clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);
//得到指定Class对象的一个构造函数,具体得到那个构造函数由传入次方法的参数决定。 1.public Constructor<T> getconstructor(Class<?>...); //此处应用了1.5的新特性:可变参数 示例: Class clazz = String.class Constructor cstr = clazz.getconstructor(String.class) Constructor类中有一个newInstance()方法可以得到新的对象 public newInstance(Object...) Strings s =(String)cstr.newInstance(new String("abc"));
public statec void changeStringValue(Object obj){ //获得一个对象,调用Fields方法获得对象中的所有字段 Field[] fields = obj.getClass().getFields(); //遍历存放字段的Field[]数组,每一次便利都将字段临时存放到变量field for(Field field : fields) { //如果field字段的类型是String. if (field.getType() == String.class) { //获取field字段中的值,用OldValue记录。 String OldValue = (String)field.get(obj); //将OlcValue中的b 替换成a; String NewValue = OldValue.repalce('b', 'a'); //将obj对象上field表示的字段(String字段),设定为newValue; field.set(obj, newValue); } }}
通过Class创建指定类的对象
1,调用空参数的构造函数:使用了Class类中的newInstance()方法。
2,调用带参数的构造函数:先要获取指定参数列表的构造函数对象,然后通过该构造函数的对象的newInstance(实际参数) 进行对象的初始化。
Class clazz = Class.forName("cn.itcast.bean.Person");//类加载 // 直接获得指定的类型 clazz = Person.class; // 根据对象获得类型 Object obj = new Person("zhangsan", 19); clazz = obj.getClass(); Object obj = clazz.newInstance();//该实例化对象的方法调用就是指定类中的空参数构造函数, 该如何创建该类对象呢?请看method_2();public static void method_2() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); //既然类中没有空参数的构造函数,那么只有获取指定参数的构造函数,用该函数来进行实例化。 //获取一个带参数的构造器。 Constructor constructor = clazz.getConstructor(String.class,int.class); //想要对对象进行初始化,使用构造器的方法newInstance(); Object obj = constructor.newInstance("zhagnsan",30); //获取所有构造器。 Constructor[] constructors = clazz.getConstructors();//只包含公共的 constructors = clazz.getDeclaredConstructors();//包含私有的 for(Constructor con : constructors) { System.out.println(con); }}
反射指定类中的方法:
//获取类中所有的方法。public static void method_1() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Method[] methods = clazz.getMethods();//获取的是该类中的公有方法和父类中的公有方法。 methods = clazz.getDeclaredMethods();//获取本类中的方法,包含私有方法。 for(Method method : methods) { System.out.println(method); }} //获取指定方法;public static void method_2() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); //获取指定名称的方法。 Method method = clazz.getMethod("show", int.class,String.class); //想要运行指定方法,当然是方法对象最清楚,为了让方法运行,调用方法对象的invoke方法即可,但是方法运行必须要明确所属的对象和具体的实际参数。 Object obj = clazz.newInstance(); method.invoke(obj, 39,"hehehe");//执行一个方法//运行私有方法。public static void method_3() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); //要获取私有方法。必须用getDeclearMethod(); Method method = clazz.getDeclaredMethod("method", null); // 私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。 method.setAccessible(true);}//反射静态方法。public static void method_4() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Method method = clazz.getMethod("function",null); method.invoke(null,null);}
- [黑马程序员]10高新技术 - 反射
- 黑马程序员-高新技术-反射
- 黑马程序员 高新技术---反射
- 黑马程序员-高新技术-反射
- 黑马程序员-高新技术-反射
- 黑马程序员--高新技术--反射
- 黑马程序员_高新技术------反射
- 黑马程序员 高新技术<二>---> 反射
- 黑马程序员-高新技术(反射)
- 黑马程序员-Java高新技术-反射
- 黑马程序员-------(高新技术)反射
- 黑马程序员-高新技术(反射)
- 黑马程序员-反射(高新技术)
- 【黑马程序员】java高新技术反射
- 黑马程序员 Java高新技术---反射
- 黑马程序员--高新技术之反射
- 黑马程序员---高新技术之反射
- 黑马程序员---------------高新技术之反射
- 黑马程序员——GUI
- Combine Two Tables
- 收到推送后,处理页面跳转
- HQL中fetch的作用
- 视频编解码之基本原理
- [黑马程序员]10高新技术 - 反射
- SpringMVC拦截器(资源和权限管理)
- Second Highest Salary
- Gvim入门(2)——解决各种乱码问题
- 网上商城首页实现总结(一)
- YII2常用表单元素
- C++控制台一闪而过
- win7下如何装vc6
- centos 安装 jdk