1.通过类的实例获得Class对象和完整的包名和路径名
User user = new User();
System.err.println(user.getClass().getName());
2.获取Class类对象的三种方法
Class<?> demo1=null;
Class<?> demo2=null;
Class<?> demo3=null;
try{
//一般尽量采用这种形式
demo1=Class.forName("com.Demo");
}catch(Exception e){}
demo2=new Demo().getClass();
demo3=Demo.class; //从类中获取
3.通过构造实例化对象
(1)通过Class实例化类对象(只能无参)
demo=Class.forName("Reflect.Person");
per=(Person)demo.newInstance();
(2)获取全部构造函数
//取得全部的构造函数
Constructor<?> cons[]=demo.getConstructors();
per1=(Person)cons[0].newInstance("Rollen",20);
per2=(Person)cons[1].newInstance(20);
per3=(Person)cons[2].newInstance("Rollen");
per3=(Person)cons[3].newInstance();
(3)获取指定构造函数
Constructor con=demo.getConstructor(String.class,int.class);
per1=(Person)con.newInstance("lisi",3);
(4)获取私有构造函数
Constructor con=demo.getDeclaredConstructor(String.class,int.class);
//破解,设置无障碍true
con.setAccessible(true);
per1=(Person)con.newInstance("lisi",3);
4.获取接口
Class<?> intes[]=demo.getInterfaces();
5.获取父类Class
Class<?> temp=demo.getSuperclass();
6.获取类构造函数的全部信息(修饰符,参数)
Constructor<?>cons[]=demo.getConstructors(); //获取所有构造函数
for (int i = 0; i < cons.length; i++) {
Class<?> p[]=cons[i].getParameterTypes(); //获取具体构造函数参数数组
System.out.print("构造方法: ");
int mo=cons[i].getModifiers(); //获取具体构造函数修饰符数量
System.out.print(Modifier.toString(mo)+" "); //静态方法获取修饰符
System.out.print(cons[i].getName());
System.out.print("(");
for(int j=0;j<p.length;++j){
System.out.print(p[j].getName()+" arg"+i); //获取参数名
if(j<p.length-1){
System.out.print(",");
}
}
System.out.println("){}");
}
7.获取和调用方法
Person person=new Person("xsa",10);
Method method=demo.getMethod("sayhello");
method.invoke(person); //返回函数结果或null
Method method1=demo.getMethod("sayhello",String.class,int.class);
method1.invoke(person,"xxx",5); //返回函数结果或null
Method[] methods=demo.getDeclaredMethods(); //得到所有方法
8.获取属性
Field[] fields=demo.getDeclaredFields(); //获取所有属性
Field field=demo.getDeclaredField("name"); //获取单个属性
field.setAccessible(true); //破解private
field.set(person,"cvcvcv"); //设置person的name属性为cvcvcv
System.err.println(field.get(person)); //输出person对应的属性
9.ioc 原理:利用反射机制的工厂模式
package Reflect;
interface fruit{
public abstract void eat();
}
class Apple implements fruit{
public void eat(){
System.out.println("Apple");
}
}
class Orange implements fruit{
public void eat(){
System.out.println("Orange");
}
}
class Factory{
public static fruit getInstance(String ClassName){
fruit f=null;
try{
f=(fruit)Class.forName(ClassName).newInstance();
}catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
class hello{
public static void main(String[] a){
fruit f=Factory.getInstance("Reflect.Apple");
if(f!=null){
f.eat();
}
}
}