通过反射获取构造方法,成员变量及成员方法
来源:互联网 发布:香港域名注册處 编辑:程序博客网 时间:2024/05/20 16:11
1.获取字节码文件对象的三种方式:
A:Object类的getClass()方法
B:数据类型的静态class属性(Java中的每一种数据类型都会有这个静态属性)
C:Class类的静态方法forName(String name):全类名
public class ReflectDemo { public static void main(String[] args) throws Exception { Person person1 = new Person(); Person person2 = new Person(); System.out.println(person1 == person2); // A:Object类的getClass()方法 Class class1 = person1.getClass(); Class class2 = person2.getClass(); System.out.println(class1 == class2); // B:数据类型的静态class属性(java中的每一种数据类型都会有这个静态属性)(类名.class) Class class3 = Person.class; System.out.println(class1 == class3); // C:Class类的静态方法forName(String name):全类名(Class.forName("全类名");) Class class4 = Class.forName("com.edu.Person"); System.out.println(class1 == class4); }}
public class Person { // 定义成员变量 String name; public int age; private String address; // 定义构造方法 public Person() { } private Person(String name) { this.name = name; } protected Person(String name, int age, String address) { this.name = name; this.age = age; this.address = address; } // 定义成员方法 public void show() { System.out.println("public show"); } private void method() { System.out.println("private method"); } void function() { System.out.println("function"); } protected String getString(String s1, String s2, String s3) { return s1 + s2 + s3; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address + "]"; }}
2.通过反射的方式如何获取构造方法:
1、获取类的字节码文件对象
2.获取构造方法对应的对象
3.使用构造方法
import java.lang.reflect.Constructor;public class ReflectConstructorDemo { public static void main(String[] args) throws Exception { // 获取类的字节码文件对象 Class fm = Class.forName("com.edu.Person"); // 获取构造方法对应的对象 // public Constructor<?>[] getConstructors(),仅仅能够获取公有的构造 // public Constructor<?>[] getDeclaredConstructors(),获取所有构造,包括私有 // Constructor con = fm.getConstructor(); // System.out.println(con); // Constructor[] con = fm.getDeclaredConstructors(); // for (Constructor con1 : con) { // System.out.println(con1); // } // Constructor con = // forName.getDeclaredConstructor(String.class,int.class,String.class); // System.out.println(con); Constructor con = fm.getDeclaredConstructor(String.class, int.class, String.class); // 暴力反射 con.setAccessible(true); // 使用构造方法 Object obj = con.newInstance("诸葛亮", 30, "卧龙坡"); System.out.println(obj); }}
3.通过反射获取成员变量并使用
public Field[] getFields()获取公有的成员变量
public Field[] getDeclaredFields()获取全部的成员变量,包括私有
public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有
public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取公有的
public void set(Object obj,Object value) 给一个对象的一个字段设置一个值
import java.lang.reflect.Constructor;import java.lang.reflect.Field;public class ReflectFiledDemo { public static void main(String[] args) throws Exception { // 获取字节码文件对象 Class fm = Class.forName("com.edu.Person"); // 获取构造函数对象 Constructor con = fm.getConstructor(); Object obj = con.newInstance(); // 获取成员变量 // public Field[] getFields()获取公有的成员变量 // Field[] fie = fm.getFields(); // for (Field field : fie) { // System.out.println(field); // } // public Field[] getDeclaredFields()获取全部的成员变量,包括私有 // Field[] fie = fm.getDeclaredFields(); // for (Field field : fie) { // System.out.println(field); // } // public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有 Field addressField = fm.getDeclaredField("address"); Field nameField = fm.getDeclaredField("name"); Field ageField = fm.getDeclaredField("age"); nameField.setAccessible(true); addressField.setAccessible(true); // public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取公有的 // Field fie = fm.getField("age"); // System.out.println(fie); // // public void set(Object obj,Object value) 给一个对象的一个字段设置一个值 nameField.set(obj, "诸葛亮"); ageField.set(obj, 50); addressField.set(obj, "卧龙坡"); System.out.println(obj); }}
4.通过反射获取成员方法并使用
public Method[] getMethods()获取所有公共成员方法,包括父类
public Method[] getDeclaredMethods()获取所有成员方法,包括私有
public Method getMethod(String name, Class)
import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class ReflectMethodDemo { public static void main(String[] args) throws Exception { // 创建字节码文件对象 Class fm = Class.forName("com.edu.Person"); // 创建构造函数对象 Constructor con = fm.getDeclaredConstructor(); Object obj = con.newInstance(); // public Method[] getMethods()获取所有公共成员方法,包括父类 // Method[] methods = fm.getMethods(); // for (Method method : methods) { // System.out.println(method); // } // public Method[] getDeclaredMethods()获取所有成员方法,包括私有 // Method[] methods = fm.getDeclaredMethods(); // for (Method method : methods) { // System.out.println(method); // } // public Method getMethod(String name, Class<?>... parameterTypes) // 参数一:方法名 参数二:方法参数类型.class 获取指定的公共方法 // Method method = fm.getMethod("show"); // Method method = fm.getMethod("show"); // System.out.println(method); // public Method getDeclaredMethod(String name,Class<?>... // parameterTypes) // 参数一:方法名 参数二:方法参数类型.class 获取指定的方法,包括私有 Method method = fm.getDeclaredMethod("getString", String.class, String.class, String.class); method.setAccessible(true); // Object invoke(Object obj, Object... args) 让某一个对象使用这个方法,并且传入参数 Object objString = method.invoke(obj, "诸葛亮", "住在", "卧龙坡"); System.out.println(objString); }}
案例:我给你ArrayList的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?
import java.lang.reflect.Method;import java.util.ArrayList;public class ArrayReflect { public static void main(String[] args) throws Exception { ArrayList<Integer> arrayList = new ArrayList<Integer>(); // 获取字节码文件对象 Class class1 = arrayList.getClass(); // 获取add(E e)方法原型 Method method = class1.getDeclaredMethod("add", Object.class); // 添加字符串 method.invoke(arrayList, "java"); method.invoke(arrayList, "world"); method.invoke(arrayList, "hello"); System.out.println(arrayList); }}
0 0
- 通过反射获取构造方法,成员变量及成员方法
- 反射_通过反射获取成员变量、构造方法、成员方法的使用
- java反射2-获取构造方法、成员变量、成员方法
- 反射机制的概述和字节码对象的获取,通过反射获取构造方法并使用;通过反射获取成员变量并使用;通过反射获取私有成员变量并使用;通过反射获取成员方法并使用
- java反射之获取方法,成员变量,构造方法
- 通过Java反射机制获取对象、方法和成员变量
- Java学习提要——"反射"获取方法信息(成员函数、成员变量 、构造函数)
- 通过反射获取类对象的成员函数、成员变量(只获取成员函数)、构造函数
- Java笔记——利用反射机制获取成员变量及成员方法
- java开发之成员变量及成员方法的反射
- Java通过反射来获取类的私有构造方法和成员方法
- 构造方法_普通方法_成员变量的反射
- 反射(成员方法和成员变量)
- java反射,获取类的方法,成员变量,构造函数信息
- java反射学习笔记(3)---使用Class来获取方法、成员变量、构造函数信息
- java反射的应用 构造方法 成员变量
- 成员方法,成员变量,局部变量,构造方法,构造器
- 反射-通过反射获取无参无返回值成员方法、带参带返回值成员方法并使用
- Qt进度简单提示
- 108. Convert Sorted Array to Binary Search Tree
- LeetCode题解(Week 1):287. Find the Duplicate Number
- Android底层驱动移植--gslx680电容触摸屏驱动
- 美素数;不要62
- 通过反射获取构造方法,成员变量及成员方法
- 简述C语言动态、静态内存分配
- C++ 中使用sstream进行string和int相互转换
- android之存储篇_SQLite数据库_让你彻底学会SQLite的使用
- OpenGL 蓝宝书第七版 windows+vs 所需的环境的配置
- Gradle's dependency cache may be corrupt
- C++与QML交互1:在C++中调用QML对象
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
- Android开发常用开源框架:图片处理