Java反射常用API
2017-02-01 20:22
399 查看
Java反射概述
Java通过反射技术可以动态的创建类的实例并可以拿到类的定义、方法、属性等,从而可以实现非常灵活的功能。Java反射常用API
直接上代码。MyReflect.java
package com.mrbcy.bigdata.basic.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Before; import org.junit.Test; public class MyReflect { public String className = null; public Class personClass = null; @Before public void init() throws Exception { className = "com.mrbcy.bigdata.basic.reflect.Person"; personClass = Class.forName(className); } @Test public void getClassName() throws Exception { System.out.println(personClass); } @Test public void getClassName2() throws Exception { System.out.println(Person.class); } @Test // 获得实例 public void getNewInstance() throws Exception { System.out.println(personClass.newInstance()); } // 获得非私有的构造函数 @Test public void getPublicConstructors() throws Exception { Constructor constructor = personClass.getConstructor(Long.class,String.class); Person person = (Person) constructor.newInstance(100L,"你好"); System.out.println(person); } // 获得私有的构造函数 @Test public void getPrivateConstructor() throws Exception { Constructor constructor = personClass.getDeclaredConstructor(String.class); constructor.setAccessible(true); // 强制取消Java的权限检测 Person person = (Person) constructor.newInstance("啊哈哈哈"); System.out.println(person); } // 获得非私有的成员变量 @Test public void getNotPrivateField() throws Exception { Constructor constructor = personClass.getConstructor(Long.class,String.class); Object object = constructor.newInstance(100L,"张三"); Field field = personClass.getField("name"); field.set(object, "李四"); System.out.println(object); } // 获得私有的成员变量 @Test public void getPrivateField() throws Exception { Constructor constructor = personClass.getConstructor(Long.class); Object object = constructor.newInstance(10000L); Field field = personClass.getDeclaredField("id"); field.setAccessible(true); field.set(object, 1L); System.out.println(object); } /** *获取非私有的成员函数 */ @Test public void getNotPrivateMethod() throws Exception { System.out.println(personClass.getMethod("toString")); Object obj = personClass.newInstance();//获取空参的构造函数 Method toStringMethod = personClass.getMethod("toString"); Object object = toStringMethod.invoke(obj); System.out.println(object); } /** *获取私有的成员函数 */ @Test public void getPrivateMethod() throws Exception { Object obj = personClass.newInstance();//获取空参 4000 的构造函数 Method method = personClass.getDeclaredMethod("getSomeThing"); method.setAccessible(true); Object value = method.invoke(obj); System.out.println(value); } // 其他方法 @Test public void otherMethod() throws Exception { //当前加载这个class文件的那个类加载器对象 System.out.println(personClass.getClassLoader()); //获取某个类实现的所有接口 Class[] interfaces = personClass.getInterfaces(); for (Class class1 : interfaces) { System.out.println(class1); } //反射当前这个类的直接父类 System.out.println(personClass.getGenericSuperclass()); /** * getResourceAsStream这个方法可以获取到一个输入流,这个输入流会关联到name所表示的那个文件上。 */ //path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 System.out.println(personClass.getResourceAsStream("/log4j.properties")); System.out.println(personClass.getResourceAsStream("log4j.properties")); //判断当前的Class对象表示是否是数组 System.out.println(personClass.isArray()); System.out.println(new String[3].getClass().isArray()); //判断当前的Class对象表示是否是枚举类 System.out.println(personClass.isEnum()); System.out.println(Class.forName("com.mrbcy.bigdata.basic.reflect.City").isEnum()); //判断当前的Class对象表示是否是接口 System.out.println(personClass.isInterface()); System.out.println(Class.forName("com.mrbcy.bigdata.basic.reflect.TestInterface").isInterface()); } }
Person.java
package com.mrbcy.bigdata.basic.reflect; import java.io.Serializable; public class Person implements Serializable,TestInterface{ private Long id; public String name; public Person() { this.id = 100L; this.name = "afsdfasd"; } public Person(Long id, String name) { // super(); this.id = id; this.name = name; } public Person(Long id) { super(); this.id = id; } @SuppressWarnings("unused") private Person(String name) { super(); this.name = name+"======="; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } private String getSomeThing() { return "sdsadasdsasd"; } private void testPrivate(){ System.out.println("this is a private method"); } }
TestInterface.java
package com.mrbcy.bigdata.basic.reflect; public interface TestInterface { }
City.java
package com.mrbcy.bigdata.basic.reflect; public enum City { }
相关文章推荐
- Java 反射常用 API(一)
- java 常用API 方法
- Java 常用API文档
- 常用javaAPI
- java 中的反射API 暑假第十天
- java 中的反射API 暑假第十天
- java常用的加密,解密,数字签名等API
- 黑马日记第六篇——java常用API
- JAVA中常用的API浅谈之二
- JAVA中常用的API浅谈之一
- Java第六课 数组的复制与排序,Runtime类与Process类,Class类与反射API,Runtime类与单例设计模式。
- Java 常用API的运用,效率及技巧
- Java 常用API文档
- 用java常用加密,解密,数字签名等常用API
- java2d常用api练习
- Java学习,数组的相关操作,封装类,Class类,反射API
- 用java常用加密,解密,数字签名等常用API
- [零基础学JAVA]Java SE应用部分-34.Java常用API类库 推荐
- Java虚拟脚本常用API
- 09---java中常用api