java 反射

万事万物接对象,类也是对象(类类型),是java.lang.Class的对象。

1. 创建类类型的3种方法

package com.sun;

public class demo {
    public static void main(String[] args) throws ClassNotFoundException {
        //创建类类型
        //1.通过类获得类类型
        Class c1 = Foo.class;
        //2.通过对象获得类类型
        Foo foo = new Foo();
        Class c2 = foo.getClass();
        //3.通过对象的相对路径获得类类型
        Class c3 = Class.forName("com.sun.Foo");

        // 通过类类型创建类对象
        Foo foo1 = (Foo) c1.newInstance();
    }
}
class Foo {
}

2. 类类型方法

2.1 获取类信息方法

Class c = obj.getClass();//获取对象类类型
//获取类类型名称
String className = c.getName();
//类类型的方法
Method[] ms = c.getMethods();//获取类类型的方法集合
    //Method中的方法
for(int i = 0; i < ms.length;i++){
            //得到方法的返回值类型的类类型
        Class returnType = ms[i].getReturnType();
        String returnName = returnType.getName();
            //得到方法的名称
        String mothodName =ms[i].getName();
            //获取参数类型--->得到的是参数列表的类型的类类型
        Class[] paramTypes = ms[i].getParameterTypes();
        for (Class class1 : paramTypes) {
            String paramType = class1.getName();
        }
    }   

2.2 获取类成员变量信息

/* Field类封装了关于成员变量的操作
* getFields()方法获取的是所有的public的成员变量的信息
* getDeclaredFields获取的是该类自己声明的成员变量的信息
*/
        Field[] fs = c.getDeclaredFields();
        for (Field field : fs) {
            //得到成员变量的类型的类类型
            Class fieldType = field.getType();
            String typeName = fieldType.getName();
            //得到成员变量的名称
            String fieldName = field.getName();
        }

2.3 获取类的构造函数信息

/*
* getConstructors获取所有的public的构造函数
* getDeclaredConstructors得到所有的构造函数
*/
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
    //获取构造函数的参数列表--->得到的是参数列表的类类型
    Class[] paramTypes = constructor.getParameterTypes();
}

2.4 获取&调用类类型的方法

  • getMethod获取的是public的方法
  • getDelcaredMethod自己声明的方法
    //遗留问题?什么是Public方法什么是自己声明的方法,没有区别或重合吗?
//设A类有有多次重构的printf();方法。
A a= new A();
Class c = a.getClass();
Method m = c.getMethod("printf",int.class,int.class);//获取相应方法,方法名+参数的类类型
object obj = m.invoke(a,6,9);//通过反射调用类方法,对象+参数。
  • 插播:控制台输入字符流
BufferedReader reader  = new BufferedReader( new InputStreamReader(System.in));
System.out.println(reader.readLine());

静态加载类&动态加载类

  • 静态加载类:编译时候加载的类
  • 动态加载类:运行时候加载的类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值