首先创建一个Person类,在其中创建三个不同类型的属性变量
public class Person {
private int age;
String name;
public String address;
public Person() {
}
Person(int age) {
this.age = age;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public void show() {
System.out.println(age + ":" + name);
}
public void function(String s) {
System.out.println("function " + s);
}
public String method(String name, int age) {
return name + ":" + age + " string";
}
private void print() {
System.out.println("print");
}
@Override
public String toString() {
return name + ":" + age + ":" + address;
}
}
在这里首先是要获取到Person对象的字节码文件,获取的方式有以下几种:
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// 第一种方式
Person p = new Person();
Class c = p.getClass();
// System.out.println(c);
Person p2 = new Person();
Class c2 = p2.getClass();
System.out.println(p == p2);// false
System.out.println(c == c2);// true
// 第二种方式
Class c3 = Person.class;
System.out.println(c == c3);
// 第三种方式 类要写全路径名称
Class c4 = Class.forName("cn.itcast.reflect.Person");
System.out.println(c == c4);
}
}
接下来就是要获取到Person类中的构造方法
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// 获取字节码文件对象
Class c = Class.forName("cn.itcast.reflect.Person");
// 获取构造方法
// Constructor[] cons = c.getConstructors();
Constructor[] cons = c.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
/*
* Person p = new Person(); sop(p);
*/
System.out.println("*******************************");
// 通过Class的newInstance方法创建对象
Object obj = c.newInstance(); // 默认调用的是无参构造方法
System.out.println(obj);
System.out.println("*******************************");
// 获取单个构造方法
//Constructor<T> getConstructor(Class<?>... parameterTypes)
//Class数组其实就是参数的Class类型数组
//获取的是无参构造方法
Constructor c1 = c.getConstructor();
//如果通过c1创建对象
//T newInstance(Object... initargs)
//Object...数组其实就是参数的Object类型数组
/*
* Person p = new Person();
* Person p = new Person("张三",20);
*/
Object obj1 = c1.newInstance();
System.out.println(obj1);
System.out.println("*******************************");
//如果得到有参数构造创建的对象呢
Class[] classes = new Class[2];
classes[0] = int.class;
classes[1] = String.class;
Constructor c2 = c.getConstructor(classes);
//通过带参构造方法创建对象
Object[] objs = new Object[2];
objs[0] = 20;
objs[1] = "zhangsan";
Object obj2 = c2.newInstance(objs);
System.out.println(obj2);
}
}
接下来就是创建对象了,创建对象的方法
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
Class c = Class.forName("cn.itcast.reflect.Person");
// 获取带参构造方法
// 第一种
// Class[] classes = new Class[2];
// classes[0] = int.class;
// classes[1] = String.class;
// Constructor con = c.getConstructor(classes);
// 第二种
// Constructor con = c.getConstructor(new Class[] { int.class,
// String.class });
// 第三种 可变参数会自动把这两个参数包装成一个Class类型的数组
Constructor con = c.getConstructor(int.class, String.class);
// 创建对象
// Object[] objs = new Object[2];
// objs[0] = 20;
// objs[1] = "lisi";
// Object obj = con.newInstance(objs);
Object obj = con.newInstance(20, "lisi");
System.out.println(obj);
}
}
这些都是基本代码,如有错误,敬请指正,共同学习
|