海阔天空

当前时间为:
欢迎大家来到海阔天空https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

2020java教程:反射

未分类
2020-09-08 15:48:48
1822677238@qq.com

手机扫码查看

2020java教程:反射

反射

什么是类对象?
类的对象:基于某个类 new 出来的对象,也成为实例对象。
类对象:类加载的产物,封装了一个类的所有信息(类名,父类,接口,属性,方法,构造方法)。

获取类对象

通过类的对象,获取类对象
Student s=new Student();
Class c=s.getClass();

通过类名获取类对象
Class c=类名.class

通过静态方法获取类对象
Class c=Class.forName(“包名.类名”)

常用方法
public String getName()
public Package getPackage()
public Class<? super T> getSuperclass()
public Class<?>[] getInterfaces()
public field[] getFields()
public Method[] getMethods()
public Constructor<?>[] getConstructors()
public T newInstance()

工厂设计模式
开发中有一个非常重要的原则“开闭原则”,对拓展开放,对修改关闭。
工厂模式主要负责对象创建的问题。
可通过反射进行工厂模式的设计,完成动态的对象创建。

工厂模式获取类对象

import java.io.*;

public class demos{
    public static void main(String[] args) {
        BufferedReader br=null;
        try{
            br=new BufferedReader(new FileReader(new File("app\\config.txt")));
            String name = br.readLine();
            Object o=createClass(name);
            System.out.println(o);
        }catch (Exception e){}
    }
    public static Object createClass(String str){
        Class c=null;
        try{
            c=Class.forName(str);
            return c.newInstance();
        }catch (Exception e){}
        return null;
    }
}
class Teacher{}

通过反射实现通用编程(调用任何方法)

import java.lang.reflect.Method;
import java.util.Properties;

public class demos{
    public static void main(String[] args) {
        Properties properties=new Properties();
        invokeAny(properties,"setProperty",new Class[]{String.class,String.class},"CN","中国");
        System.out.println(properties.getProperty("CN"));
    }
    public static void invokeAny(Object obj,String methodName,Class[] types,Object... o){
        Class c=null;
        try{
            c=obj.getClass();
            Method method = c.getDeclaredMethod(methodName, types);
            method.invoke(obj,o);
        }catch (Exception e){}
    }
}
import java.lang.reflect.Method;

public class demos{
    public static void main(String[] args) {
        invokeAny(new Teacher(),"tech",new Class[]{String.class,int.class},"tom",22);
    }
    public static void invokeAny(Object obj,String methodName,Class[] types,Object... args){
        Class c=null;
        try{
            c=obj.getClass();
            Method m = c.getDeclaredMethod(methodName, types);
            m.setAccessible(true);//注意:反射一种java的底层技术,可以无视封装
            m.invoke(obj,args);
        }catch (Exception e){}
    }
}
class Teacher{
    private String name;
    private Integer age;
    private Double salary;
    public Teacher() {
    }
    public Teacher(String name, Integer age, Double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    public void tech(String name,int age){
        System.out.println(name+age);
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注