反射也叫做剖析用来做框架
用反射来创建对象分成以下步骤:
1.得到类(加载类);
2.得到构造方法(注意参数)
3.用要加载的类的参数来在我们的类中创建对象;
一下为一个实例:
--------》先创建一个类:Person 分别有几个不同的构造函数
package dau02two;
import java.util.List;
public class Person {
public int age = 55;
public Person(){
System.out.println("person");
}
public Person(String name){
System.out.println("person name");
}
public Person(String name,int age){
System.out.println("hyl,55");
}
private Person(List list){
System.out.println("list");
}
public int age = 55;
public Person(){
System.out.println("person");
}
public Person(String name){
System.out.println("person name");
}
public Person(String name,int age){
System.out.println("hyl,55");
}
private Person(List list){
System.out.println("list");
}
}
-----》再创建一个类使用反射机制创建对象
package dau02two;
import java.awt.List;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
public class Reflecttwo {
public static void main(String[] args) throws Exception{
//无参的
Class s = Class.forName("/day02/src/dau02two/Person");//得到类
Constructor d = s.getConstructor(null);//得到无参数的构造方法
Person p = (Person)d.newInstance(null);//用得到的构造方法来创建一个对像,强转成Person的对象
System.out.println(p.age);
//有参数的
Class c = Class.forName("/day02/src/dau02two/Person");
Constructor a = c.getConstructor(String.class);//这是加载带字符串参数的标准姿势里面必须指出参数类型
Person p1 = (Person)d.newInstance("asus");//创建的时候是一个实例的创建必须有实例化的参数
System.out.println(p.age);
//私有的
Class c1 = Class.forName("/day02/src/dau02two/Person");
Constructor a2 = c1.getDeclaredConstructor(List.class);//得使用私有的得到构造方法
a2.setAccessible(true);//暴力反射,好现实啊
Person p2 = (Person)a2.newInstance(new ArrayList());
//简便方法
Class c2 = Class.forName("/day02/src/dau02two/Person");
Person p3 = (Person)c2.newInstance();//特定的无参的
System.out.println(p3);//这也从侧面说明了在定义一个类的时候最好定义一个无参的构造函数,便于一些极端的代码的工作
}
//无参的
Class s = Class.forName("/day02/src/dau02two/Person");//得到类
Constructor d = s.getConstructor(null);//得到无参数的构造方法
Person p = (Person)d.newInstance(null);//用得到的构造方法来创建一个对像,强转成Person的对象
System.out.println(p.age);
//有参数的
Class c = Class.forName("/day02/src/dau02two/Person");
Constructor a = c.getConstructor(String.class);//这是加载带字符串参数的标准姿势里面必须指出参数类型
Person p1 = (Person)d.newInstance("asus");//创建的时候是一个实例的创建必须有实例化的参数
System.out.println(p.age);
//私有的
Class c1 = Class.forName("/day02/src/dau02two/Person");
Constructor a2 = c1.getDeclaredConstructor(List.class);//得使用私有的得到构造方法
a2.setAccessible(true);//暴力反射,好现实啊
Person p2 = (Person)a2.newInstance(new ArrayList());
//简便方法
Class c2 = Class.forName("/day02/src/dau02two/Person");
Person p3 = (Person)c2.newInstance();//特定的无参的
System.out.println(p3);//这也从侧面说明了在定义一个类的时候最好定义一个无参的构造函数,便于一些极端的代码的工作
}
}
//私有的东西本来不能被外界访问但用反射可以a2.setAccessible(true);//暴力反射,正像现实中的知法犯法,哈哈