java--反射

反射能创建实例对象,但是比new 更加能解决耦合性



1)反射调用构造函数

java.lang.Class<T>里:

取得全部构造:public Constructor<?>[] getConstructors() throws SecurityExceptio

取得一个指定参数顺序的构造:public Constructor<T> getConstructor(Class<?>... parameterTypes)

                                                throws NoSuchMethodException, SecurityException    


java.lang.reflect.Constructor<T>里:

实例化对象方法:public T newInstance(Object... initargs)

                     throws InstantiationException,
                     IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException



public class test{
    public static void main(String args[]) throws Exception {
        Class<?> cls = Class.forName("com.lw.Book");
        Object obj = cls.newInstance(); //调用无参构造函数

        Constructor<?> con = cls.getConstructor(String.class,double.class);
        Object o1 = con.newInstance("java开发",34.5); //实例化对象

        Constructor<?> con1 = cls.getConstructor();
        Object o2 = con1.newInstance();
    }
}



class Book {
    private String title;
    private double price;
    public Book(String title,double price){
        this.price = price;
        this.title = title;
    }
    public Book(){
        this.title = "我是默认书名称";
        this.price =0.0;
    }
    @Override
    public String toString() {
        return "名称:" + this.title + ",价格:" + this.price;
    }
}




2)反射调用成员函数

java.lang.class<T>

取得一个类中的所有方法:public Method[] getMethods()
                                         throws SecurityException

取得指定的方法:public Method getMethod(String name,Class<?>... parameterTypes)
                          throws NoSuchMethodException,SecurityException


java.lang.reflect.Method里:

调用方法:public Object invoke(Object obj,Object... args)

              throws IllegalAccessException,IllegalArgumentException,    InvocationTargetException
                     
                    

public class test{
    public static void main(String args[]) throws Exception {
        Class<?> cls = Class.forName("com.lw.Book");
        Object obj = cls.newInstance(); //调用无参构造函数
        String fieldName = "title";//要操作的成员

        Method setMet = cls.getMethod("setTitle",String.class);
        Method getMet = cls.getMethod("get"+initcap(fieldName));

        setMet.invoke(obj,"java开发"); //调用方法
        System.out.println(getMet.invoke(obj));
        System.out.println(obj);

    }
    public static String initcap(String str){ //首字母大写
        return str.substring(0,1).toUpperCase() + str.substring(1);
    }
}



class Book {
    private String title;
    private double price;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    @Override
    public String toString() {
        return "名称:" + this.title + ",价格:" + this.price;
    }
}


3)反射调用成员

java.lang.class<T>里:

取得全部成员:public Field[] getDeclaredFields() throws SecurityException

取得指定成员:public Field getDeclaredField(String name) throws NoSuchFieldException,SecurityException


java.lang.reflect.Field里:

取得属性内容:public Object get(Object obj)
throws IllegalArgumentException,IllegalAccessException

设置属性的内容:public void set(Object obj,Object value)
                          throws IllegalArgumentException,IllegalAccessException


Field 从java.lang.rflect.AccessibleObject里继承了:

设置是否封装:public static void setAccessible(AccessibleObject[] array,boolean flag)
                       throws SecurityException

构造函数和普通成员函数也能取消封装,很少这样做


public class test{
    public static void main(String args[]) throws Exception {
        Class<?> cls = Class.forName("com.lw.Book");
        Object obj = cls.newInstance(); //调用无参构造函数
        Field titleField = cls.getDeclaredField("title");
        titleField.setAccessible(true); //封装取消
        titleField.set(obj,"Java开发"); //相当于Book类对象.title = "Java开发"
        System.out.println(titleField.get(obj));
    }
}


class Book {
    private String title;
}






fffdfs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值