java--反射机制

Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架

下面代码:
1:反射的三种实例化方法
2:通过反射调用有参构造方法(Constructor类)
3:通过反射调用类的成员方法(Method类)
4:通过反射调用类的成员参数,对参数进行解封装操作(Filed类);

package main.java.learn;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

class apple{
    public void print(){
        System.out.println("apple");
    }
}
class orange{
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {

        return name;
    }

    public orange(String name){
        this.name=name;
    }
    public void print(){
        System.out.println(this.name);
    }
}
public class abstractClass extends Thread{
    public void test1(){
        //三种源头类实例化方法

        //通过getclass()方法
        apple a=new apple();
        Class<?> cls=a.getClass();
        System.out.println(cls.getName());
        //通过 lei.class获得
        cls=String.class;
        System.out.println(cls.getName());
        //通过类的全路径名称获得,这种是最常用的反射操作使用方法
        try {
            cls=Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(cls.getSimpleName());
    }
    public void test2(){
        //利用反射实例化对象,主要用于解决使用new产生的耦合现象(例如工厂中的new耦合现象)
        try {
            Class<?> cls=Class.forName("main.java.learn.apple");
            try {
                Object obj=cls.newInstance();//newInstance()返回的为Object类型的对象,需要进行向下转型为对应的类
                //newInstance()方法调用的是类的无参构造方法,即要求提供无参构造方法,否则会抛出异常
                apple app=(apple)obj;//进行向下转型
                app.print();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //利用反射调用构造方法,避免类中没有无参构造方法
        //通过实例化Constructor类获得相应的含参构造方法
        try {
            Class cls=Class.forName("main.java.learn.orange");
            try {
                Constructor con=cls.getConstructor(String.class);
                try {
                    Object obj=con.newInstance("orange");
                    orange org=(orange)obj;
                    org.print();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //利用反射调用对象方法,通过method类的成员方法进行调用
        try {
            Class cls = Class.forName("main.java.learn.orange");
            try {
                Constructor con = cls.getConstructor(String.class);
                try {
                    Object obj = con.newInstance("orange");
                    String o="orange";
                    Method setOrg=cls.getMethod("setName",String.class);
                    Method getOrg=cls.getMethod("getName");
                    System.out.println(getOrg.invoke(obj));
                    setOrg.invoke(obj,"Orange");
                    //这里的invoke方法是method类对象的成员方法,主要是为了实现对于method调用反射类方法的实现,第一个参数是Object对象,余下参数和调用的方法的参数相同
                    orange org=(orange)obj;
                    System.out.println(org.getName());
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //利用反射获得对象成员,通过Filed类的成员方法进行调用
        try {
            Class<?> cls=Class.forName("main.java.learn.orange");
            try {
                Constructor con=cls.getConstructor(String.class);
                try {
                    Object obj=con.newInstance("new orange");
                    try {
                        Field name=cls.getDeclaredField("name");//获得成员
                        name.setAccessible(true);//解封装,除去成员属性为private时所造成的外部成员无法直接访问的行为
                        name.set(obj,"old orange");//相当于正常调用set方法
                        System.out.println(name.get(obj));
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    }
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        new abstractClass().test2();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值