• Java基础重要知识点-反射


    反射,如何把.java文件转化为.class文件

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    所以说:任何类或对象在反射面前都是裸体

     

    详情:

    try {

    Class forName = Class.forName("com.facebook.entity.Student"); //获得类名,这是写前提条件,获得class文件

     

    try {

    // Constructor con = forName.getConstructor(); //括号里有null

     

    // //通过反射来实例化这个对象,这里等同于实例化了一个Student StudentStudent s=new Student();

    // Object object = con.newInstance();

    // System.out.println(object+"100");

     

    //获取单个私有构造,这里是获得带2个参的私有构造,

    // Constructor con = forName.getDeclaredConstructor(int.class,String.class);

    ///通过暴力反射,去除私有

    // con.setAccessible(true);

     

    // //通过反射来实例化这个对象,这个参数是具体的类型,获取构造方法后,这一步是创建对象赋值,

    // Object object = con.newInstance(2,"zhang");

    // System.out.println(object);

     

    //获得属性

    //获得所有公有属性

    // Field[] fields = forName.getFields();

    // for (int i = 0; i < fields.length; i++) {

    // System.out.println(fields[i]+"100");

    // }

     

    //获取所有属性,包括私有

    // Field[] f = forName.getDeclaredFields();

    // for (int i = 0; i <f.length; i++) {

    // System.out.println(f[i]+"100");

    // }

     

    //获得单个公有有的属性,传递的参数就是你要获取的属性的名字

    // try {

    // Field field = forName.getField("name");

    //

     

    // //给属性赋值(1.产生一个对象,2.赋值)

    // Object obj = forName.getConstructor().newInstance();

    //

    // //第一个参数是你要赋值的对象,第二个是你要赋的值

    // field.set(obj, "zhang2");

    // Student s=(Student)obj;

    // System.out.println(s+"100");

    // } catch (NoSuchFieldException e) {

    // // TODO Auto-generated catch block

    // e.printStackTrace();

    // }

     

    //获取私有单个属性,步骤和上面一样,私有的多了一个暴力反射

    // try {

    // Field ff = forName.getDeclaredField("id");

    // Object obj = forName.getConstructor().newInstance();

    // ff.setAccessible(true);

    // ff.set(obj, 123); //暴力反射

    // Student s=(Student)obj;

    // System.out.println(s+"100");

    // } catch (NoSuchFieldException e) {

    // // TODO Auto-generated catch block

    // e.printStackTrace();

    // }

     

    //获取所有公有的方法,因为是所有,所以返回的是数组,要遍历

    // Method[] methods = forName.getMethods();

    // for (int i = 0; i < methods.length; i++) {

    // System.out.println(methods[i]);

    // }

     

    //获得所有公有和私有的方法,所以返回的是数组,要遍历

    // Method[] m= forName.getDeclaredMethods();

    // for (int i = 0; i < m.length; i++) {

    // System.out.println(m[i]);

    // }

     

    //获得单个公有的方法,并调用

    // Method m = forName.getMethod("show");

    // //产生一个对象

    // Object obj3 = forName.getConstructor().newInstance();

    // Object invoke3 = m.invoke(obj3,null);

    // System.out.println(invoke3+"100");

     

    //获得单个私有的方法,并调用

    Method m2 = forName.getDeclaredMethod("show1",String.class); //第一个参数是方法名,第二个参数是方法后面参数类型

    Object obj = forName.getConstructor().newInstance();

    m2.setAccessible(true);

    Object invoke = m2.invoke(obj, "22");

    System.out.println(invoke+"123456");

    List<String> list=new ArrayList<String>(); //现在规定只能传字符串

    list.add("aa");

    list.add("bb");

     

    Class class1 = list.getClass(); //利用反射可以忽略泛型,利用泛型可以传其他类型数据

    Method m1 = class1.getMethod("add", Object.class);

    m1.invoke(list, 113);

    for (Object string : list) { //这里要改成object

    System.out.println(string);

    }

  • 相关阅读:
    关东升的《从零開始学Swift》即将出版
    input子系统驱动学习之中的一个
    linux 搭建https server (apache)
    Http协议具体解释
    三天学会HTML5——SVG和Canvas的使用
    阿里2016实习offer五面经验与总结
    你所须要知道的项目管理知识
    【hadoop2.6.0】用C++ 编写mapreduce
    【leetcode】 Letter Combinations of a Phone Number(middle)
    【杂感】目标跟踪的用途
  • 原文地址:https://www.cnblogs.com/binghuaZhang/p/10780918.html
Copyright © 2020-2023  润新知