Java 基础之反射

        反射是java中很重要的知识,因为一些框架都用到了反射了,不懂反射,你可能就不懂框架的一些原理。反射的作用是通过反射获取一个类,类的变量(私有,公有,默认,保护等),还可以获取类的方法等等。简单的来说就是4个,Field(变量),Method(方法),Class(类对象),Constructor(构造方法).使用反射的前提是要获取类的字节码文件,即类的.class文件(字节码文件),因为是从.class文件中,去解析类.把各个成分解析成一个对象.

获取class对象有以下几种方法方法,接下来我们来简单操作:

public class School {

    public void schoolTest() throws ClassNotFoundException {
//        通过实例化对象去获取class,这种已经实例化了对象,要 class也没有什么作用
        School school = new School();
        Class c1 = school.getClass();
//        通过对象去获取class,这种方式对于包的依赖性很强
        Class c2= School.class;
//        通过对象去获取包路径,我们大多数都是用这种方式
        Class c3 = Class.forName("com.jinshuaitec.sort.reflex.School");
    }
}

接下来我们要获取构造方法

 public School(){
        System.out.println("empty");
    }
    public School(String name){
        System.out.println(name);
    }

    public School(int age){
        System.out.println(age);
    }

在这里书写了三个构造方法.

让我们来看下源码

//        批量获取方法
        public Constructor[] getConstructors(); //获取所有的public 方法
        public Constructor[] getDeclaredConstructors();//获取所有的方法,包括private,protected,default等
//        获取单个方法
        public Constructor getConstructor(Class... parameterTypes)//根据参数类型获取公有的构造方法
        public Constructor getDeclaredConstructor(Class... parameterTypes)//根据参数类型获取所有的构造方法

操作:

 Class reflexTest = Class.forName("com.jinshuaitec.sort.reflex.School");
        System.out.println("start print constructor");
        Constructor[] conArray = reflexTest.getConstructors();
        for (Constructor constructor: conArray){
            System.out.println(constructor);
        }
        System.out.println("获取所有的构造方法");
        conArray = reflexTest.getDeclaredConstructors();
        for (Constructor constructor:conArray){
            System.out.println(constructor);
        }
        System.out.println("获取公有的无参构造方法");
        Constructor constructor = reflexTest.getConstructor(null);
        System.out.println(constructor);
        Object object = constructor.newInstance("我是第一个参数");//实例化对象
//        获取String类型参数的构造方法
        Constructor constructor1 = reflexTest.getConstructor(String.class);

接下来获取成员变量

定义变量:

  public String schoolName;
    protected int schoolIphone;
    private String schoolAddress;

接下来获取数据

 public void filed() throws Exception{
        Class school = Class.forName("com.jinshuaitec.sort.reflex.School");
        System.out.println("获取所有的public字段");
        Field[] fields = school.getFields();
        for (Field field :fields){
            System.out.println(field.getName());
        }
        System.out.println("获取所有的private,protected,default等字段");
        Field [] privateFields = school.getDeclaredFields();
        for (Field field : privateFields){
            System.out.println(field.getName() + "获取变量名字");
        }
        System.out.println("获得某一个变量");
        Field f = school.getField("schoolName");
        System.out.println("创建对象实例");
        Object obj = school.getConstructor().newInstance();
        System.out.println("为变量赋值");
//        给name属性赋值,obj为某一个类
        f.set(obj,"我是name属性");
//        这里有一个注明,要获取私有变量时,赢应书写下面的语句
//        这里表明解除私有的限制,让外界可以访问到
        f.setAccessible(true);
    }

接下来是获取Method:

  public void method() throws Exception{
//        获取类文件
        Class school = Class.forName("com.jinshuaitec.sort.reflex.School");
//        获取公开的方法
        Method[] methods = school.getMethods();
        for (Method method : methods){
            System.out.println(method.getName());
        }
//      获取所有的方法,包括private,protected等
        Method [] declareMethod = school.getDeclaredMethods();
        for (Method method : declareMethod){
            System.out.println(method);
        }
        Method publicMethod = school.getMethod("publicMethod", String.class);
//        执行方法
        publicMethod.invoke(school,"我是jins");
        Method defaultMethod = school.getDeclaredMethod("defaultMethod");
        Method privateMethod = school.getDeclaredMethod("privateMethod", int.class);
//        执行私有方法
        privateMethod.invoke(school,12);
    }

反射可能在我们写代码的时候很少用到,但是你用的很多地方都用到了反射,希望以后大家在用到反射的时候可以手到拈来.

如果大家还想看我的更多文章,请大家关注我的微信公众号(程序员知识积累).谢谢大家

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目:用 JavaScript 编写的《小鸡快跑》游戏 小鸡快跑游戏是一个 javascript 项目。这是一款简单而有趣的游戏,你可能将它列入你的愿望清单中。这款游戏主要包含 javascript 和一些 CSS,以使其看起来很漂亮。这款游戏与著名的谷歌浏览器离线游戏恐龙跑者非常相似。 游戏玩法 游戏玩法简单有趣。你所要做的就是控制你的小鸡,跳过障碍物。这只鸡的名字叫“Pepper”。在这里,你必须让 Pepper 跳起来,并尽量避开即将到来的威胁。控制键是 W、空格键或向上箭头键。 当你继续游戏时,游戏速度通常会以更快的速度增加。试着按下控制按钮跳得更高,这样 Pepper 就可以跳得更高,以避开障碍物。当你最终撞到障碍物时,你终于可以查看你的得分了。此外,你还可以在社交媒体上分享你的得分。 总的来说,这款游戏玩起来相当有趣。此外,作为一名 程序员,它能让你以某种方式更轻松、更完美地提高你的程序编写能力。这款游戏纯粹是用 javascript 制作的。游戏开发过程中没有使用任何类型的框架。 您可以通过查看下面的图片滑块来查看我们的项目 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值