java反射相关
2017-08-04 19:49
232 查看
1.反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2.反射机制的作用
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码,并重新编译。 使用反射: class.forName("person").newInstance(); 而且这个类描述可以写到配置文件中,如 **.xml, 这样如果想实例化其他类,只要修改配置文件的"类描述"就可以了,不需要重新修改代码并编译。 增加程序的灵活性。 如struts中。请求的派发控制。 当请求来到时。struts通过查询配置文件。找到该请求对应的action。已经方法。 然后通过反射实例化action。并调用响应method。 如果不适用反射,那么你就只能写死到代码里了。 所以说,一个灵活,一个不灵活。 很少情况下是非用反射不可的。大多数情况下反射是为了提高程序的灵活性。 因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。
3.一些相关方法
getDeclaredField是可以获取一个类的所有字段.
getField只能获取类的public 字段.
getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,
但不包括继承的方法。当然也包括它所实现接口的方法。
GetDeclaredConstructor()返回所有的构造器,包括public和private
GetConstructor()返回public的构造器
getFields()只能获取public的字段,包括父类的。
而getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
4.一些实例
1)通过一个对象获得完整的包名和类名
package reed.sankuai.reflect; /** * Created by fanqunsong on 2017/7/26. */ public class TestReflect { public static void main(String[] args) { TestReflect testReflect = new TestReflect(); System.out.println(testReflect.getClass().getName()); } }输出 reed.sankuai.reflect.TestReflect
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2)实例化Class类对象
package reed.sankuai.reflect; import java.io.Serializable; /** * Created by fanqunsong on 2017/7/26. */ public class TestReflectImpl implements Serializable{ public static void main(String[] args) throws Exception{ Class<?> class1 = Class.forName("reed.sankuai.reflect.TestReflectImpl"); Class<?> class2 = new TestReflectImpl().getClass(); Class<?> class3 = TestReflectImpl.class; System.out.println("类名称 "+class1.getName()); System.out.println("类名称 "+class2.getName()); System.out.println("类名称 "+class3.getName()); } }类名称 reed.sankuai.reflect.TestReflectImpl
类名称 reed.sankuai.reflect.TestReflectImpl
类名称 reed.sankuai.reflect.TestReflectImpl
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
获取一个对象的父类与实现的接口
package reed.sankuai.reflect; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /** * Created by fanqunsong on 2017/7/26. */ public class TestReflectImpl implements Serializable{ public static void main(String[] args) throws Exception{ Class<?>clazz = Class.forName("reed.sankuai.reflect.TestReflectImpl"); Class<?>parentClass = clazz.getSuperclass(); System.out.println("clazz的父亲为"+parentClass.getName()); Class<?>intes[] = clazz.getInterfaces(); System.out.println("clazz实现的接口有: "); for (int i = 0; i <intes.length ; i++) { System.out.println((i+1)+":"+intes[i].getName()); } } }clazz的父亲为java.lang.Object
clazz实现的接口有:
1:java.io.Serializable
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
package reed.sankuai.reflect; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; /** * Created by fanqunsong on 2017/7/26. */ public class TestReflectImpl implements Serializable{ public static void main(String[] args) throws Exception{ Class<?> class1 = Class.forName("reed.sankuai.reflect.User"); User user = (User) class1.newInstance(); user.setAge(20); user.setName("Reed"); System.out.println(user); Constructor<?> cons[] = class1.getConstructors(); for (int i = 0; i <cons.length ; i++) { Class<?> clazzs[] = cons[i].getParameterTypes(); System.out.print("cons["+i+"]("); for(int j = 0; j < clazzs.length; j++){ if (j==clazzs.length-1) System.out.print(clazzs[j].getName()); else System.out.print(clazzs[j].getName()+","); } System.out.println(")"); } }
class User { private int age; private String name; public User() { super(); } public User(String name) { super(); this.name = name; } public User(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [age=" + age + ", name=" + name + "]"; } }
输出如下
User [age=20, name=Reed]
cons[0](int,java.lang.String)
cons[1](java.lang.String)
cons[2]()
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4000
-------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public class SetSomeProperty { public static void main(String[] args) throws Exception{ ArrayList<Integer> list = new ArrayList<Integer>(); Method method = list.getClass().getMethod("add", Object.class); method.invoke(list,"Java反射机制实例。"); System.out.println(list.get(0)); } }
输出 Java反射机制实例。
----------------------------------------------------------------------------------------------------------------------------------------------------
通过反射机制改变私有属性的值
public class SetSomeProperty { private String property = "reedfan"; public static void main(String[] args) throws Exception{ Class<?> clazz = Class.forName("reed.sankuai.reflect.SetSomeProperty"); Object obj = clazz.newInstance(); Field field = clazz.getDeclaredField("property"); field.setAccessible(true); field.set(obj,"fanqunsong"); System.out.println(field.get(obj)); }
输出 fanqunsong
------------------------------------------------------------------------------------------------------------------------
通过反射机制调用某个类的方法
public class TestSomeMethod { public static void main(String[] args) throws Exception{ Class<?>clazz = Class.forName("reed.sankuai.reflect.TestSomeMethod"); Method method = clazz.getMethod("reflect1"); method.invoke(clazz.newInstance()); method = clazz.getMethod("reflect2", int.class,String.class); method.invoke(clazz.newInstance(), 26, "范群松"); } public void reflect1(){ System.out.println("Java 反射机制-调用某个类的方法1"); } public void reflect2(int age,String name){ System.out.println("Java 反射机制-调用某个类的方法2"); System.out.println("age-> "+age+ ". name--> "+ name); } }
Java 反射机制-调用某个类的方法1
Java 反射机制-调用某个类的方法2
age-> 26. name--> 范群松
------------------------------------------------------------------------------------------------------------------------------------------------
相关文章推荐
- Java反射框架Type Class 及相关方法浅析
- java反射相关
- java反射相关要素
- java基础-反射(2):泛型相关周边信息获取
- Java反射相关问题
- Spring中反射相关 BeanUtils.java 源码
- Java学习,数组的相关操作,封装类,Class类,反射API
- Java反射相关(一)
- java反射相关
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- java 反射相关的知识点
- Java反射相关类结构 package: java.lang.reflect
- java反射获取相关值
- 夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取
- java 的反射机制相关方法的使用
- Java 反射(2):泛型相关周边信息获取
- java 反射method 相关
- 【java反射】Class类型的相关操作演练
- java学习笔记 反射reflection相关知识点小结
- (12)java 反射 ----- 反射相关