Java反射机制入门
来源:互联网 发布:apache jmeter 下载 编辑:程序博客网 时间:2024/05/21 06:27
关于Java的反射机制
一、什么是反射
- JAVA反射机制(The JAVA reflection mechanism)是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
二、反射的常用方法
首先我们想通过反射获取类或者接口的属性和方法,就必须获得这个类或者接口的Class对象。
1.使用Class类的静态方法 Class.forName(String name)2.类的语法,如:Stirng.class3.使用类的实例化的getClass方法,如: obj.getClass();
获取类的构造器
//1.返回类中所有的公有构造方法集合,默认构造方法的下标为0public Constructor<?>[] getConstructors() //2.返回指定公有构造器,参数为构造器参数类型集合public Constructor<T> getConstructor(Class<?>... parameterTypes) //3.返回类中所有的构造器(包括私有)public Constructor<?>[] getDeclaredConstructors()//4.返回任意指定的构造器(包括私有)public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
- 获取类的成员变量
//1.获取任意指定名字的成员变量(包括私有)public Field getDeclaredField(String name)//2.获取所有的成员变量(包括私有)public Field[] getDeclaredFields() //3.获取任意公有成员变量public Field getField(String name) //4.获取所有的公有成员变量public Field[] getFields()*Field重要方法 字段设置为指定的新值set(Object obj,Object value)
- 获取类的方法
//1.获取任意指定方法(包括私有)public Method getDeclaredMethod(String name,Class<?>... parameterTypes) //2.获取所有的方法(包括私有)public Method[] getDeclaredMethods() //3.获取所有的公有方法的集合public Method[] getMethods() //4.获取指定公有方法public Method getMethod(String name,Class<?>... parameterTypes) *Method重要方法 执行该方法invoke(Object obj,Object…parmasType);
三、反射使用举例
- 获取类的三种方法
Person p1 = new Person(); // 方法1:通过对象调用getClass方法,获取该类本身 Class<?> c1 = p1.getClass(); // 方法2:通过类的名字直接获取该类本身 Class<?> c2 = Person.class; System.out.println(c2); // 方法3:通过类的全称包名+类名 Class<?> c3 = Class.forName( "com.ljy.reflect.Person" ); System.out.println(c3);
- 通过反射获取构造方法:
public class ConstructorTest { public static void main(String[] args) { //获取反射类 Class<?> personClass = null; try { //Person对象所在的包名 personClass = Class.forName( "com.ljy.reflect.Person" ); //获取反射类中的所有构造方法 Constructor<?>[] constructors = personClass.getDeclaredConstructors(); for (Constructor<?> constructor : constructors) { // 获取构造方法的名称 String name = constructor.getName(); System.out.println(name); } } catch (ClassNotFoundException e) { e.printStackTrace(); } try { //获取对应个数的参数构造方法 获取无参数的写null Constructor<?> constructor = personClass.getDeclaredConstructor(String.class); //可以使用私有的构造方法 constructor.setAccessible(true); //通过反射的构造方法获取person的实例 Person p =(Person)constructor.newInstance("ljy"); // 获取Person对象的name属性值 System.out.println(p.getName()); //获取两个参数的构造方法 Constructor<?> constructor2 =personClass.getDeclaredConstructor(String.class,int.class) ; Person p2=(Person)constructor2.newInstance("ljy2",18); System.out.println(p2.getAge()+" "+p2.getName()); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }}
- 通过反射获取方法:
//通过反射类对象中的私有方法public class MethodTest { public static void main(String[] args) { try{ Person person = new Person(); person.setAge(18); person.setName("ljy"); String msg = null; Class<?> personClass = Class.forName("com.ljy.reflect.Person"); // 获取字节码文件中的所有的方法 Method[] methods = personClass.getDeclaredMethods(); for (Method method : methods) { // 取得方法的名字 String methodName = method.getName(); System.out.println(methodName); method.setAccessible(true); if (methodName.equals("getNameAndAge")) { // 调用person类中的名字为getNameAndAge的方法 msg = (String)method.invoke(person, null); } } System.out.println(msg); //通过传递方法名和方法中的参数的字节码 用反射的方式获得该方法 Method method = personClass.getDeclaredMethod("setName", String.class) ; method.setAccessible(true); //执行该方法 并给此方法中的参数赋值 method.invoke(person, "ljy3"); System.out.println(person.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } }}
- 通过反射获取成员变量
public class FieldTest { public static void main(String[] args) { Class<?> personClass = Person.class; Person person = null; try { //获取字节码个数的 方法的构造函数 Constructor<?> constructor = personClass.getDeclaredConstructor(String.class,int.class); constructor.setAccessible(true); //用获取的构造函数初始化person对象 person = (Person) constructor.newInstance("ljy2",22); System.out.println(person.getName()+" "+person.getAge()); // 通过反射变量的名字,获取对应类中的成员变量 获取Person对象中为name的私有变量名 Field field = personClass.getDeclaredField("name"); field.setAccessible(true); //为name变量赋值 field.set(person,"ljy"); System.out.println(person.getName()); // 获得全部的成员变量 Field fields[] = personClass.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { fields[i].setAccessible( true); String fieldName = fields[i].getName(); if(fieldName.equals("age")) { // 设置对应成员变量的值 fields[i].setInt(person,18); } } System.out.println(person.getAge()); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }}
1 0
- JAVA反射机制入门
- Java反射机制入门
- 0012 Java反射机制【入门】
- java反射机制----初步入门
- Java入门学习-反射机制
- Java反射机制,入门初探
- java反射机制入门介绍
- 【反射】JAVA反射机制
- Java之反射机制【入门版(2)】
- Java之反射机制【入门版(1)】
- Java之反射机制【入门版(3)】
- Java之反射机制【入门版(4)】
- Java之反射机制【入门版(4),实例解析】
- java语言基础入门——反射机制实例
- 十分钟带你入门Java的反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- 单例模式7种实现
- 循环队列的实现
- android--线程
- 手势解锁代码实现
- bzoj1251 序列终结者
- Java反射机制入门
- 手势
- hitTest方法底层实现
- android 4 DnsPinger一点分析
- hitTest方法底层实现(2)
- 图片水印
- 使用WinWebMail 简单搭建一个局域网邮件服务 并 测试
- 地址译码方式
- Swing 线程之SwingUtilities.invokeLater()