您的位置:首页 > 编程语言 > Java开发

通过反射获取构造方法,成员变量及成员方法

2017-02-25 00:41 609 查看
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=
4000
" + 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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java
相关文章推荐