反射机制

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();
        }
    }
}

https://www.cnblogs.com/Eason-S/p/5851078.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值