java反射

  • 所谓的反射实际上是通过clazz.getClass()方法获取一个类型为Class类型的对象,通过getName()、getPackage()、getMethods()等方法获取类的相关数据;
  • 获取类的反射对象
1.Class.forName(全类名)–一般用这个
2.类名.class 
3.对象.getClass()方法

Example2 example2 = new Example2();
Class a1 = Class.forName("Example2");
System.out.println(a1);
Class a = Example2.class;
System.out.println(a);
Class<? extends Example2> exampleC = example2.getClass();
System.out.println(exampleC);

// out
class Example2
class Example2
class Example2
  • 反射对象常用方法:
clazz.getName(); // 获取类名
clazz.getPackage; // 获取包名

clazz.getInterfaces(); // 获取接口
clazz.getSuperclass(); // 获取父类

clazz.getMethod();
//获取所有公共方法(1本类,父类,接口。2非私有)
clazz.getMethods(String name, 参数);
clazz.getDeclaredMethod(String name, 参数)
clazz.getDeclaredMethods(); //获取本类所有方法(包括私有) 

clazz.getConstructor(String name, 参数); //获取单个public权限的构造器
clazz.getConstructors(); // 获取多个public权限的构造器
 获取单个(有参根据传入的是什么类型找对应的构造函数)
clazz.geDeclaredtConstructor(String name, 参数); // 获取单个所有权限的构造器
clazz.getDeclaredConstructors(); // 获取多个所有权限的构造器

clazz.getField(String name);  // 获取所有公共属性(1本类,父类,接口。2非私有)
clazz.getFields();  // 获取所有公共属性(1本类,父类,接口。2非私有)
clazz.getDeclaredField(String name); // 获取本类单个属性(包括私有) 
clazz.getDeclaredFields(); // 获取本类所有属性(包括私有) 

clazz.getClasses() // 获取public内部类
clazz.getDeclaredClasses() // 获取内部所有的类
  • 通过反射访问构造方法
public class Main1 {
    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
        Example1 example1 = new Example1("10", "20", "30");
        Class<? extends Example1> exampleC = example1.getClass();
        Constructor[] constructors = exampleC.getDeclaredConstructors();
        for (Constructor constructor: constructors){
            System.out.println("constructor: " + constructor);
            Class[] types = constructor.getParameterTypes();
            for (Class type: types){
                System.out.println("type: " + type);
            }
            Class[] exceptions = constructor.getExceptionTypes();
            for (Class exception: exceptions){
                System.out.println("exception: " + exception);
            }
            Example1 example2 = (Example1) constructor.newInstance("10", "20");
        }
    }
}

public class Example1 {
    private String s;
    private int i1, i2, i3;
    public Example1(){

    }
    public Example1(String s, int i){
        this.s = s;
        this.i1 = i;
    }
    public Example1(String... args){
        if (1 < args.length){
            this.i1 = Integer.valueOf(args[0]);
        }
        if (2 < args.length){
            this.i2 = Integer.valueOf(args[1]);
        }
        if (13 < args.length){
            this.i3 = Integer.valueOf(args[2]);
        }
    }

    public void print(){
        System.out.println("s" + s);
        System.out.println("i1" + i1);
        System.out.println("i2" + i2);
        System.out.println("i3" + i3);
    }
}
  • 通过反射获取成员变量
public class Main2 {
    public static void main(String[] args) throws IllegalAccessException {
        Example2 example2 = new Example2();
        Class<? extends Example2> exampleC = example2.getClass();
        // 只能获取public权限的成员变量
        Field[] fields1 = exampleC.getFields();
        for (Field field: fields1){

            System.out.println("field1的名称" + field.getName());
            System.out.println("field1的类型" + field.getType());
        }
        // 获取所有权限类型的成员变量
        Field[] fields2 = exampleC.getDeclaredFields();
        for (Field field: fields2){
            System.out.println("field2的名称" + field.getName());
            System.out.println("field2的类型" + field.getType());
            // 我们边通过设置忽略访问权限直接访问私有的成员变量
            field.setAccessible(true);
            if (field.getType() == int.class){
                field.setInt(example2, 1);
            }

        }
    }
}

public class Example2 {
    private int i;
    public float f;
    protected boolean b;
    private String s;
}
  • 访问方法
public class Main3 {

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Example3 example3 = new Example3();
        Class<? extends Example3> clazz = example3.getClass();
        Method[] methods = clazz.getDeclaredMethods();
        for (Method method: methods){
            System.out.println("getName: " + method.getName());
            System.out.println("getReturnType: " + method.getReturnType());
            System.out.println("getParameterTypes: " + method.getParameterTypes());
            System.out.println("isVarArgs: " + method.isVarArgs());
            if (method.getName().equals("staticMethod")){
                method.invoke(example3);
            }
            if (method.getName().equals("publicMethod")){
                method.invoke(example3 ,1);
            }

        }

    }
}

public class Example3 {
    static void staticMethod(){
        System.out.println("执行static方法");
    }

    public int publicMethod(int i){
        System.out.println("执行public方法");
        return i * 100;
    }

    protected int protectedMethod(String s, int i){
        System.out.println("执行protected方法");
        return Integer.valueOf(s) + i;
    }

    private String privateMethod(String... strings){
        System.out.println("执行private方法");
        StringBuffer stringBuffer = new StringBuffer();
        for (String string: strings){
            stringBuffer.append(string);
        }
        return stringBuffer.toString();
    }
}
内容概要:文章详细介绍了ETL工程师这一职业,解释了ETL(Extract-Transform-Load)的概念及其在数据处理中的重要性。ETL工程师负责将分散、不统一的数据整合为有价值的信息,支持企业的决策分析。日常工作包括数据整合、存储管理、挖掘设计支持和多维分析展现。文中强调了ETL工程师所需的核心技能,如数据库知识、ETL工具使用、编程能力、业务理解能力和问题解决能力。此外,还盘点了常见的ETL工具,包括开源工具如Kettle、XXL-JOB、Oozie、Azkaban和海豚调度,以及企业级工具如TASKCTL和Moia Comtrol。最后,文章探讨了ETL工程师的职业发展路径,从初级到高级的技术晋升,以及向大数据工程师或数据产品经理的横向发展,并提供了学习资源和求职技巧。 适合人群:对数据处理感兴趣,尤其是希望从事数据工程领域的人士,如数据分析师、数据科学家、软件工程师等。 使用场景及目标:①了解ETL工程师的职责和技能要求;②选择适合自己的ETL工具;③规划ETL工程师的职业发展路径;④获取相关的学习资源和求职建议。 其他说明:随着大数据技术的发展和企业数字化转型的加速,ETL工程师的需求不断增加,尤其是在金融、零售、制造、人工智能、物联网和区块链等领域。数据隐私保护法规的完善也使得ETL工程师在数据安全和合规处理方面的作用更加重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值