Java基础之反射机制
来源:互联网 发布:js时间戳计算时间差 编辑:程序博客网 时间:2024/05/14 16:54
反射机制
JAVA有着一个非常突出的动态相关机制:反射。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射使用
获取Class实例
获取Class实例有三种方法可以获取。实际上前两种方法也带有了包名,类实例getName方法就可以获得。第三种方法的好处,用字符串拼写指定任意包名路径,灵活性强。比如从xml文件获取的包名字符串。
Class<?> cls = Apple.class Class<?> cls = new Apple().getClass(); Class<?> cls = Class.forName("com.xxx.Apple"); //推荐 cls.getName();//com.xxx.Apple
实例化对象
有了Class实例就可以快乐地玩耍。所有属性和方法都在Class实例里面,还有实例化对象。
Apple apple = (Apple) cls.newInstance();
实例化对象就是这么简单,但只是调用无参构造函数。想要调用有参构造函数。就要调用Class实例的getConstructors方法获取所有构造器。要注意的是只能获取非私有的构造器,同样的调用非私有的构造器会抛异常。
Constructor<?>[] constructors = cls.getConstructors(); for(Constructor<?> cons : constructors){ Class<?>[] params = cons.getParameterTypes();//获取构造器中的参数类型 } apple = (Apple) constructors[1].newInstance(new Color());//public Apple(Color c) apple = (Apple) constructors[2].newInstance("apple");//public Apple(String name)
反射字段
获取字段也很简单。调用Class实例的getDeclaredFields方法获取本类字段,也可以调用getFields方法获取父类或接口的字段。调用字段只要找到相应的属性名,然后通过set方法传入对象和值就好了。要注意的是私有字段要setAccessible为true。
Field[] fields = cls.getDeclaredFields();//获取字段 for (Field f : fields) { String m = Modifier.toString(f.getModifiers());//获取字段修饰符 f.getType();//获取字段类型 f.getName();//获取字段名 } //反射字段调用 Object obj = cls.newInstance(); Field field = cls.getDeclaredField("name"); field.setAccessible(true);//修改私有字段必须设置true field.set(obj, "apple"); System.out.println(field.get(obj));
反射方法
反射方法跟反射字段都差不多。
Method[] methods = cls.getMethods(); for (Method m : methods) { m.getReturnType();//获取方法返回类型 m.getParameterTypes();//获取方法参数类型 String mod = Modifier.toString(m.getModifiers());//获取方法修饰符 m.getExceptionTypes();//获取方法异常 } //反射方法调用 Object obj = cls.newInstance(); //获取私有的private void setName(String name) Method method = cls.getDeclaredMethod("setName", String.class); method.setAccessible(true);//允许修改私有 method.invoke(obj, "apple");//调用方法 //获取公共无参printName方法 method= cls.getDeclaredMethod("printName"); method.invoke(obj);//调用方法
反射应用
反射机制使代码在运行时灵活获取信息。用的范围也很多。比如上面说的读取文件创建对象,动态工厂模式创建对象,运行时强行修改私有值,改变数组大小等等,有时间可以专门再写一篇。不懂点反射机制都不敢说自己是学Java的。本章就到这里,不足之处望指教。
0 0
- java反射机制之基础
- java反射机制之基础
- java基础之反射机制
- Java基础之反射机制
- java基础之反射机制
- java 基础之--java的反射机制
- Web基础之Java中的反射机制
- java反射机制基础
- java基础:反射机制
- JAVA基础--反射机制
- 【JAVA基础】反射机制
- 【java基础】Java反射机制
- 【java基础】java反射机制
- Java 之反射机制
- java之反射机制
- java之反射机制
- java之反射机制
- Java之:反射机制
- js中(function(){xxx})();写法解析以及function与!感叹号
- C顺序表及其功能的实现
- JUnit入门
- 使用AKKA做分布式爬虫的思路
- 202 Happy Number
- Java基础之反射机制
- 基于docker的hexo博客系统
- 《用python写网络爬虫》--寻找网站所有者
- ROS系列之初识gmapping
- 可变参数...
- 实现单链表及其基本操作
- WordPress插件 Pdf Premium PFD完美嵌入式专业版插件[更新至3.0.1]
- WordPress插件 WooCommerce最新微信支付接口集成插件
- 《用python写网络爬虫》--识别网站所用技术