反射基本用法和实践

反射是我们之后学习Spring框架的前置基础

为了更好的讲解反射,我们首先创建一个Person类

package com.reflect;

public class Person extends Father {
    public String test1;
    protected  String test2;
    String test3;
    private String test4;
    public void eat(){
        System.out.println("eat...");
    }
    public void eat(String str){
        System.out.println("eat..."+str);
    }
    public String getString(String str){
        return str;
    }
    private String priGetString(String str){
        return str;
    }
    public String getTest1() {
        return test1;
    }

    public void setTest1(String test1) {
        this.test1 = test1;
    }

    public String getTest2() {
        return test2;
    }

    public void setTest2(String test2) {
        this.test2 = test2;
    }

    public String getTest3() {
        return test3;
    }

    public void setTest3(String test3) {
        this.test3 = test3;
    }



    public Person(){

    }
    public Person(String test1, String test2, String test3, String test4) {
        this.test1 = test1;
        this.test2 = test2;
        this.test3 = test3;
        this.test4 = test4;
    }

    @Override
    public String toString() {
        return "Person{" +
                "test1='" + test1 + '\'' +
                ", test2='" + test2 + '\'' +
                ", test3='" + test3 + '\'' +
                ", test4='" + test4 + '\'' +
                '}';
    }
}

然后我们就可以对person类进行操作了

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.stream.Stream;

public class Feflect {
    public static void main(String[] args) throws Exception {
        //1.反射获取对象的三种方法

        //(1)
        Class cls1=Class.forName("com.reflect.Person");
        Object obj1=cls1.newInstance();
        //(2)
        Class cls2=Person.class;
        Object obj2=cls2.newInstance();
        //(3)
        Person p=new Person();
        Class cls3=p.getClass();
        Object obj3=cls3.newInstance();

        //获取公有构造器的方法,并创建实例
        Class clscon=Person.class;
        Constructor[]constructors=clscon.getConstructors();
        Constructor constructor=clscon.getConstructor();
        Constructor constructorarg=clscon.getConstructor(String.class,String.class,String.class,String.class);
        Object objcon1=constructorarg.newInstance("test1","test2","test3","test4");
        Object objcon2=constructor.newInstance();
        //获取方法并执行
        Method method1=clscon.getMethod("eat");//获得无参方法
        method1.invoke(clscon.newInstance());//无参方法执行
        Method method2=clscon.getMethod("eat",String.class);
        method2.invoke(clscon.newInstance(),"apple");
        Method methosre=clscon.getMethod("getString", String.class);
        Object objstr=methosre.invoke(clscon.newInstance(),"hello");
        System.out.println(objstr);
        Method[]methods=clscon.getMethods();//获取所有公有方法(包括从父类继承的)
        Stream.of(methods).forEach(System.out::println);
        System.out.println("----------------------");
        //获取公有私有方法(不包括父类的)
        Method[] primethod=clscon.getDeclaredMethods();
        Stream.of(primethod).forEach(System.out::println);
        //获取私有方法
        Method privatemethod=clscon.getDeclaredMethod("priGetString", String.class);
        privatemethod.setAccessible(true);//使用私有方法时需要设置为true
        Object objrestr=privatemethod.invoke(clscon.newInstance(),"hello,world");
        System.out.println(objrestr);
        //获取公有成员变量(包括父类)
        Field[] fields=clscon.getFields();
        Stream.of(fields).forEach(System.out::println);
        //获取所有的成员变量(不包括父类)
        System.out.println("-----------------");
        Field[] prifields=clscon.getDeclaredFields();
        Stream.of(prifields).forEach(System.out::println);
        //按照成员名称获取变量名
        Field field=clscon.getField("test1");
        System.out.println(field);
        System.out.println("-----------");
        //按照成员名获取私有变量名
        Field prifield=clscon.getDeclaredField("test4");
        System.out.println(prifield);
        System.out.println("----------------------");
        //获取变量值
        Object objfield=field.get(p);
        System.out.println(objfield);
        //获取私有变量值
        System.out.println("------------");
        prifield.setAccessible(true);
        Object objfipri=prifield.get(p);
        System.out.println(objfipri);
        //设置变量值
        System.out.println("-----------");
        field.set(p,"123");
        System.out.println(field.get(p));
        //设置私有变量值
        System.out.println("--------------");
        prifield.setAccessible(true);
        prifield.set(p,"456");
        System.out.println(prifield.get(p));



    }
}

了解反射的基本操作之后,我们来进行实践:

首先在src文件夹之下创建一个pro.properties文件

 文件中包含两个属性:
{

ClassName:

MethodName:

}

然后创建两个类,一个teacher类一个coder类

package com.kuangjia;

public class Teacher {
    public String name;
    public Teacher(){

    }
    public void teach(){
        System.out.println("teach student");
    }
}
package com.kuangjia;

public class Coder {

    public String name;

    public Coder(){

    }
    public void code(){
        System.out.println("coding....");
    }
}

 然后对pro.properties文件进行操作

package com.kuangjia;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class Resource {
    public static void main(String[] args) throws Exception {
        Properties pro=new Properties();//创建Properties对象
        ClassLoader loader=Resource.class.getClassLoader();//获取类加载器
        InputStream inputStream=loader.getResourceAsStream("pro.properties");//获取该文件的字节流文件
        pro.load(inputStream);//加载该字节流文件
        String classname=pro.getProperty("ClassName");//从pro对象中获取以ClassName为key的值
        String methodname=pro.getProperty("MethodName");//从pro对象中获取以MethodName为key的值
        Class cls =Class.forName(classname);//通过反射获得classname的Class对象
        Object objinstance=cls.newInstance();//创建classname对应的对象
        Method method=cls.getMethod(methodname);//获取以method为名的函数
        method.invoke(objinstance);//执行method函数
    }
}

使用反射实现解耦就完成了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值