java的反射
来源:互联网 发布:淘宝如何找上家 编辑:程序博客网 时间:2024/06/05 22:35
Class类
对象照镜子后可以得到的信息:某个类的数据成员名、方法和构造器、某个类到底实现了哪些接口。
对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。
Class 对象只能由系统建立对象
一个类在 JVM 中只会有一个Class实例
每个类的实例都会记得自己是由哪个 Class 实例所生成
获取 Class 对象的方式
//@Testpublic void testClass() throws ClassNotFoundException{//直接通过类名 获取ClassClass cls = UserInfo.class;//通过对象获取UserInfo u = new UserInfo();@SuppressWarnings("all")Class objCls = u.getClass();//通过类路径获取Class pathCls = Class.forName("reflectTest.UserInfo");}
Class类的常用方法
方法名
功能说明
static Class forName(String name)
返回指定类名 name 的Class对象
Object newInstance()
调用缺省构造函数,返回该Class对象的一个实例
Object newInstance(Object []args)
调用缺省构造函数,返回该Class对象的一个实例
getName()
返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称
Class getSuperClass()
返回当前Class对象的父类的Class对象
Class [] getInterfaces()
获取当前Class对象的接口
ClassLoader getClassLoader()
返回该类的类加载器
Class getSuperclass()
返回表示此Class所表示的实体的超类的Class
UserInfo
package reflectTest;public class UserInfo {private int id;private String name;private String sex;public UserInfo(){}private void add(){System.out.println(111);}private void add(int id){this.id = id;}public void add(int id, String name){System.out.println(222);}@Overridepublic String toString() {return "UserInfo [id=" + id + ", name=" + name + ", sex=" + sex + "]";}}
通过Class对象获取类结构中的属性结构
@Testpublic void testGetField() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{Class cls = UserInfo.class;Field field = cls.getDeclaredField("id");//获取修饰符 0 default 1 public 2 private 4 protectedSystem.out.print(field.getModifiers()+" ");//获取数据类型System.out.print(field.getType()+" ");//获取属性名称System.out.println(field.getName());}
通过Class对象获取到类中所有的属性集合
@Testpublic void testGetAllField(){Class cls = UserInfo.class;Field[] fields = cls.getDeclaredFields();for (Field field : fields) {System.out.print(field.getModifiers()+" ");System.out.print(field.getType()+" ");System.out.println(field.getName());}Method[] methods = cls.getDeclaredMethods();for (Method method : methods) {System.out.print(method.getModifiers()+" ");System.out.print(method.getReturnType()+" ");System.out.print(method.getName()+" ");Class[] type = method.getParameterTypes();for (Class class1 : type) {System.out.print(class1+",");}System.out.println();}}
通过URLClassLoader 动态加载jar包中的类
@Testpublic void testUrlClassLoader() throws MalformedURLException, ClassNotFoundException{File file = new File("src/reflectTest/dom4j-1.6.1.jar");URL url = file.toURI().toURL();URL[] urls = {url};URLClassLoader urlClassLoader = new URLClassLoader(urls);Class cls = urlClassLoader.loadClass("org.dom4j.Node");//获取所有的属性Field[] field = cls.getDeclaredFields();for (Field now : field) {System.out.print(now.getModifiers()+" ");System.out.print(now.getType()+" ");System.out.println(now.getName()+" ");}//获取所有的方法Method[] methods = cls.getDeclaredMethods();for (Method now : methods) {System.out.print(now.getModifiers()+" ");System.out.print(now.getReturnType()+" ");System.out.print(now.getName()+" ");Class[] types = now.getParameterTypes();System.out.print("(");for (Class type : types) {System.out.print(type+", ");}System.out.println(")");}}
无参数的构造方法的实例化
@Testpublic void constructorTest() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{Class cls = Student.class;Constructor<Student> cons = cls.getDeclaredConstructor();Student stu = cons.newInstance();System.out.println(stu);}
有参数的构造方法的实例化
@Testpublic void constructorParamTest() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{Class cls = Student.class;Constructor<Student> cons = cls.getDeclaredConstructor(int.class, String.class);Student stu = cons.newInstance(100, "ZS");System.out.println(stu);}
实例化的对象属性设置值和获取属性
@Testpublic void constructorTest() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException{//获取class对象Class cls = UserInfo.class;//获取构造方法Constructor<UserInfo> cons = cls.getDeclaredConstructor();//创建UserInfo对象UserInfo user = cons.newInstance();//获取到指定的属性Field field = cls.getDeclaredField("id");//私有的方法必须设置可以访问的权限field.setAccessible(true);//set方法可以设置某个对象的属性值field.set(user, 30);//get方法获取某个对象的属性值Object value = field.get(user);System.out.println(value);}
获取方法
package reflectTest;import java.lang.reflect.Method;import org.junit.Test;/** * 情况1:判断某个类中是否存在某个属性或者方法。。。 * 如果直接使用出现编译错误 * 情况2:如果想获取一个类中私有的方法和属性 * 情况3:如果想获取一个类中所有的属性和方法 * Class是反射的基础 通过这个类 可以获取类的结构 * 类包含: * 属性(修饰符,类型,属性名称,属性值) * 获取属性方法 * getDeclaredField("属性名“) * 可以获取当前类中(不包括父类)所有的属性(所有权限修饰符的属性) * getField("属性名") * 可以获取当前类或者他的你类中所有的public修饰的属性 * * getDeclaredFields() * getFields() * * 方法(返回值 方法名称, 参数名称 参数类型) * getDeclaredMethod("方法名") * 可以获取当前类中(不包括你类)所有的方法(所有权限修饰符的方法) * getMethod("方法名") * 可以获取当前类或者他的父类中所有的public修饰的方法 * getDeclaredMethods(); * getMethods(); * 构造方法(参数名称 参数类型) * * @author Administrator * */public class UserInfoFunTest {/** * 通过Class对象获取类结构跟方法结构 * getDeclaredmethod(String 方法名)返回Method对象 * @throws SecurityException * @throws NoSuchMethodException * */@Testpublic void testGetMethod() throws NoSuchMethodException, SecurityException{Class cls = UserInfo.class;Method method = cls.getDeclaredMethod("add", int.class, String.class);method.System.out.print(method.getModifiers()+" ");System.out.print(method.getReturnType()+" ");System.out.println(method.getName()+" ");Class[] clsType = method.getParameterTypes();for (Class class1 : clsType) {System.out.println("参数类型"+ class1);}}//@Testpublic void testGetAllMethod(){Class cls = UserInfo.class;Method[] methods = cls.getDeclaredMethods();for (Method method : methods) {System.out.print(method.getModifiers()+" ");System.out.print(method.getReturnType()+" ");System.out.print(method.getName()+" ");Class[] types = method.getParameterTypes();System.out.print("(");for (Class type : types) {System.out.print(type+" ");}System.out.println(")");}}}
阅读全文
0 0
- JAVA反射-反射的基本概念
- 反射,java的灵魂
- java的反射机制
- Java的反射机制
- Java的反射机制
- 说说Java的反射
- 反射,java的灵魂
- Java 的反射机制
- 反射,java的灵魂
- JAVA的反射机制
- Java 的反射机制
- java的反射机制
- Java的反射机制
- Java 的反射机制
- JAVA的反射机制
- Java 的反射机制
- java的反射机制
- java的反射机制
- yum源两种配置方法
- Mybatis 多条件查询(模糊查询 使用in查询)
- css3中的多列布局columns详解
- hihoCoder1052—基因工程
- 最大化平均值(二分搜索)
- java的反射
- Python学习05-函数和模块总结
- TensorFlow 实现 Softmax Regression 识别手写数字
- android调试命令
- Linux应用编程之串口
- JS快速排序--记录点滴
- Github 组织( organization ) 账号的申请和转换
- 34. Search for a Range
- 判断数学表达式是否合法