Java---类反射(3)---类反射加强

简介: Java---类反射---类反射加强

经过前面的一篇博客,Java—类反射(1),相信大家对类反射有了一定的了解了。

下面来进行对类反射的加强,了解一下怎么通过类反射去new一个对象,

怎么通过类反射去访问其他类的方法。

怎么通过类反射去访问其他类的成员变量。


大家也许认为一个类的私有方法,私有的成员变量是其他类访问不到。但是,类反射是可以通过暴力访问去访问的。


还有:最后要模拟Java内省的功能


类的调用(调用类中的成员)


★ 构造类对象


使用构造器新建对象。根据指定的参数类型找到相应的构造函数,传入相应参数调用执行,以创建一个新的对象实例。


代码示例

Person类代码:

package cn.hncu.reflect;
import java.io.IOException;
/**
 * @author 陈浩翔
 * 
 * @version 1.0 2016-5-2
 */
public class Person extends Parent {
    String name;
    private int age;
    public int num;
    public static String schoolName;
    public Person() {
        this("naName", 0);
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person(int age) throws IOException, NumberFormatException {
        this("naName", age);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    protected void setAge(int age) {
        this.age = age;
    }
    private int sum(int a) {
        return 0;
    }
    private int sum() {
        return 0;
    }
    int aa(String a, int b) throws IOException, NumberFormatException {
        return 0;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", num=" + num + "]";
    }
}
class Parent{
    public static final int N=100;
}


构造类对象:

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
 * 类反射的演示
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-2
 */
public class ReflectOperateObj {
    private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
    public static void main(String[] args) {
        try {
            operateConstructor(CLASS_FILE_NAME);
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 一、演示:使用构造器来新建对象
     * @param classFileName
     * @throws ReflectiveOperationException
     */
    private static void operateConstructor(String classFileName) throws ReflectiveOperationException   {
        Class cls = Class.forName(CLASS_FILE_NAME);
        //1 无参构造方法的使用----简单且以后用得最多的
        //Object obj = cls.newInstance();
        //2 有参构造方法的使用
        //用类反射的方式来执行 Object obj = new Person("Jack",20);
        //2.1获取指定"参数列表类型"的构造器---Constructor对象
        Class parameterTypes[] = new Class[2];
        parameterTypes[0] = String.class;
        parameterTypes[1] = int.class;
        Constructor con= cls.getConstructor(parameterTypes);//※1※
        //2.2调用构造器来new对象
        Object initargs[] = new Object[2];
        initargs[0] = new String("Jack");
        initargs[1] = new Integer(20);
        Object resultObj = con.newInstance(initargs);//※2※
        System.out.println(resultObj);
    }
}


输出结果:

Person [name=Jack, age=20, num=0]

★ 调用方法

根据方法名称执行方法。根据方法名与参数类型匹配指定的方法,传入相应参数与对象进行调用执行。若是静态方法,则不需传入具体对象。

代码示例:

Person还是之前的Person类…

演示:调用无参普通方法:

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
 * 类反射的演示
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-2
 */
public class ReflectOperateObj {
    private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
    public static void main(String[] args) {
        try {
            callMethod(CLASS_FILE_NAME);
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 二、演示:调用无参普通方法
     * @param classFileName
     * @throws ReflectiveOperationException
     */
    private static void callMethod(String classFileName) throws ReflectiveOperationException{
        Class cls = Class.forName(CLASS_FILE_NAME);
        //需求:调用空参方法 p.toString()
        //1.1必须要用一个类对象
        Object obj = cls.newInstance();
        //1.2用对象来调方法
           //1.2.1先拿到对应方法的Method对象
            Method m = cls.getMethod("toString", null);
            //1.2.2用obj和method来调用该方法
            Object returnValue = m.invoke(obj, null);
            System.out.println(returnValue);
    }
}

输出结果:


Person [name=naName, age=0, num=0]


演示:调用有参普通方法


Person相比之前,加了一个double sum(int , double)方法。


public double sum( int n, double d){
        double sum =0;
        for(int i=1;i<=n;i++){
            sum +=d;
        }
        return sum;
    }

演示类:

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
 * 类反射的演示
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-2
 */
public class ReflectOperateObj {
    private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
    public static void main(String[] args) {
        try {
            callMethod2(CLASS_FILE_NAME);
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 三、演示:调用有参普通方法
     * @param classFileName
     * @throws ReflectiveOperationException
     */
    private static void callMethod2(String classFileName) throws ReflectiveOperationException{
        Class cls = Class.forName(CLASS_FILE_NAME);
        //需求:调用有参方法 p.sum(10,2.34)
        //1.1必须要用一个类对象
        Object obj = cls.newInstance();
        //**1.2用对象来调方法
            //***1.2.1先拿到对应方法的Method对象
            Class parameterTypes[] = new Class[2];//形参列表---类型列表---Class数组
            //paramTypes[0]=int.class;//OK
            parameterTypes[0]=Integer.TYPE;//OK
           //paramTypes[0]=Integer.class;//ERROR: 因为Integer.class对应的是Integer类型,不是int类型。而Integer.TYPE是指int类型
            parameterTypes[1]=double.class;
            Method method = cls.getMethod("sum", parameterTypes);
           //***1.2.2用obj和method来调用该方法
            Object[] args = new Object[2];
            args[0] = 10;
            args[1] = 2.34;
            Object returnObj = method.invoke(obj, args);
            System.out.println(returnObj);
    }
}

输出结果:

23.4
• 1
• 2

演示:调用静态方法

Person类加了一个静态方法show();

public static void show(){
        System.out.println("show.........");
    }


演示类:

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
 * 类反射的演示
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-2
 */
public class ReflectOperateObj {
    private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
    public static void main(String[] args) {
        try {
            callMethod3(CLASS_FILE_NAME);   
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }
    /**
     * 四、演示:调用静态方法---不需要对象就可以调,其它的跟普通方法一样
     * @param classFileName
     * @throws ReflectiveOperationException
     */
    private static void callMethod3(String classFileName) throws ReflectiveOperationException{
        Class cls = Class.forName(CLASS_FILE_NAME);
        //调用static show();
        Method methed = cls.getMethod("show", null);
        methed.invoke(null, null);
    }
}

输出结果:

show.........
• 1
• 2



目录
相关文章
|
9天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
25 1
|
9天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
22 0
java基础(13)String类
|
13天前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
37 9
Java——反射&枚举
|
20天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
22 9
Java——类与对象(继承和多态)
|
20天前
|
SQL Java 编译器
Java——类与对象(封装)
封装是面向对象编程中的概念,指将数据(属性)和相关操作(方法)组合成独立单元(类),使外部无法直接访问对象的内部状态,只能通过提供的方法进行交互,从而保护数据安全。例如,手机将各种组件封装起来,只暴露必要的接口供外部使用。实现封装时,使用`private`关键字修饰成员变量,并提供`get`和`set`方法进行访问和修改。此外,介绍了包的概念、导入包的方式及其注意事项,以及`static`关键字的使用,包括静态变量和方法的初始化与代码块的加载顺序。
25 10
Java——类与对象(封装)
|
3天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
20天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
19天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
19 1
Java——String类详解
|
10天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
25 10
|
7天前
|
安全 Java 编译器
java访问类字段
java访问类字段
下一篇
无影云桌面