Java笔记:反射

一、基础知识

Class是泛型超类,封装了类或接口运行时的状态。Class是Java中的反射中心,可以在运行时查找类的信息。

class Solution {
    public static void main(String[] args) throws ClassNotFoundException {
        Class c = String.class;//通过类文字获取
        c = "Hello World".getClass();//通过getClass获取
        c = Class.forName("String");//通过forName获取
        c = Class.forName("String", false, Solution.class.getClassLoader());
    }
}

二、类反射

import java.lang.reflect.Modifier;
import java.lang.reflect.TypeVariable;
import java.util.List;

class Solution {
    public static void main(String[] args) {
        Class c = List.class;

        int modifier = 0;//修饰符
        if (c.isInterface())
            modifier = c.getModifiers() & Modifier.interfaceModifiers();
        else modifier = c.getModifiers() & Modifier.classModifiers();
        System.out.println(Modifier.toString(modifier));

        TypeVariable<?>[] types = c.getTypeParameters();//泛型参数
        for (TypeVariable t : types)
            System.out.println(t.getTypeName());

        Class[] interfaces = c.getInterfaces();//实现接口
        for (Class i : interfaces)
            System.out.println(i);
    }
}

三、字段反射

Field可获取类中的字段信息。

import java.lang.reflect.Field;

class Solution {
    public static void main(String[] args) {
        Class<String> c = String.class;
        Field[] fields = c.getFields();

        for (Field field : fields)
            System.out.println(field);
        //public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
    }
}

四、方法反射

import java.lang.reflect.*;

class Solution {
    static String getModifiers(Executable exec) {
        int modifier = exec.getModifiers();
        if (exec instanceof Method)
            modifier &= Modifier.methodModifiers();
        else if (exec instanceof Constructor)
            modifier &= Modifier.constructorModifiers();
        return Modifier.toString(modifier);
    }

    static String getParameters(Executable exec) {
        Parameter[] parameters = exec.getParameters();
        StringBuilder str = new StringBuilder();
        for (Parameter parameter : parameters)
            str.append(parameter + " ");
        return str.toString();
    }

    static String getExceptions(Executable exec) {
        StringBuilder str = new StringBuilder();
        Class[] cs = exec.getExceptionTypes();
        for (Class c : cs)
            str.append(c + " ");
        return str.toString();
    }

    public static void main(String[] args) {
        Class<Integer> c = Integer.class;
        Method[] methods = c.getDeclaredMethods();//不包括从超类中继承的方法
        for (Method method : methods) {
            System.out.println(method.getName());
            System.out.println(getModifiers(method));
            System.out.println(getParameters(method));
            System.out.println(getExceptions(method));
        }
    }
}

五、反射对象创建

无参构造函数。

class MyClass {
    MyClass() {
        System.out.println("Constructor called");
    }
}

class Solution {
    public static void main(String[] args) {
        Class<MyClass> c = MyClass.class;
        try {
            MyClass o = c.newInstance();
            System.out.println(o);
        } catch (InstantiationException | IllegalAccessException exc) {
            exc.printStackTrace();
        }
    }
}

带参构造函数。

import java.lang.reflect.Constructor;

class MyClass {
    MyClass(int i, String s) {
        System.out.println("Constructor called");
        System.out.println(i);
        System.out.println(s);
    }
}

class Solution {
    public static void main(String[] args) {
        Class<MyClass> c = MyClass.class;
        try {
            Constructor<MyClass> cons = c.getConstructor(int.class, String.class);//只能调用public的方法
            cons = c.getDeclaredConstructor(int.class, String.class);//可以调用本类声明的所有方法
            MyClass o = cons.newInstance(0, "Hello World");
            System.out.println(o);
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
}

反射调用方法。

import java.lang.reflect.Method;

class MyClass {
    public static void print(String s) {
        System.out.println(s);
    }
}

class Solution {
    public static void main(String[] args) {
        Class<MyClass> c = MyClass.class;
        try {
            MyClass o = c.newInstance();
            Method method = c.getMethod("print", String.class);
            method.invoke(o, "Hello World");
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
}

六、反射字段访问

import java.lang.reflect.Field;

class MyClass {
    public String str = "Hello World";
}

class Solution {
    public static void main(String[] args) {
        Class<MyClass> c = MyClass.class;
        try {
            MyClass o = c.newInstance();
            Field name = c.getField("str");
            String value = (String) name.get(o);
            System.out.println(value);

            name.set(o, "Hello World");
            value = (String) name.get(o);
            System.out.println(value);
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    }
}

访问非可访问字段、方法和构造函数。

import java.lang.reflect.Field;

class MyClass {
    private String str = "Hello World";
}

class Solution {
    public static void main(String[] args) {
        Class<MyClass> c = MyClass.class;
        try {
            MyClass o = c.newInstance();
            Field str = c.getDeclaredField("str");
            if (!str.isAccessible())
                str.setAccessible(true);
            String value = (String) str.get(o);
            System.out.println(value);
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }
    }
}

七、数组反射

import java.lang.reflect.Array;

class Solution {
    public static void main(String[] args) {
        try {
            int[] ar = (int[]) Array.newInstance(int.class, 10);
            for (int i = 0; i < 10; i++)
                Array.set(ar, i, i);
            for (int i = 0; i < 10; i++)
                System.out.println(Array.get(ar, i));
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }
    }
}

获取数组维度。

import java.lang.reflect.Array;

class Solution {
    public static void main(String[] args) {
        try {
            int[][] arr = (int[][]) Array.newInstance(int.class, 5, 5);
            Class c = arr.getClass();
            int i = 0;
            while (c.isArray()) {
                c = c.getComponentType();
                i++;
            }
            System.out.println(i);
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }
    }
}

扩展数组。

import java.lang.reflect.Array;
import java.util.Arrays;

class Solution {
    static Object extend(Object oldArr) {
        int oldLength = Array.getLength(oldArr);
        int newLength = oldLength * 2;
        Class c = oldArr.getClass();
        Object newArr = Array.newInstance(c.getComponentType(), newLength);
        System.arraycopy(oldArr, 0, newArr, 0, oldLength);
        return newArr;
    }

    public static void main(String[] args) {
        int[] arr = new int[5];
        for (int i = 0; i < arr.length; i++)
            arr[i] = i;
        System.out.println(Arrays.toString(arr));
        arr = (int[]) extend(arr);
        for (int i = 5; i < 10; i++)
            arr[i] = i;
        System.out.println(Arrays.toString(arr));
    }
}

原文地址:https://www.cnblogs.com/arseneyao/p/8463334.html

时间: 2024-08-30 06:46:35

Java笔记:反射的相关文章

java笔记--反射机制之基础总结与详解

一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象. 它提供了在运行时检查对象属性的方法,这些属性包括它的成员和类型信息. 更重要的是Class对象是所有反射API的入口. Class类是泛型类,可以使用@SuppressWarnings("unchecked")忽略泛型或者使用Class<V>类型. 获得Class对象的5种

java笔记--反射进阶之总结与详解

一.反射进阶之动态设置类的私有域 "封装"是Java的三大特性之一,为了能更好保证其封装性,我们往往需要将域设置成私有的, 然后通过提供相对应的set和get方法来操作这个域.但是我们仍然可以用java的反射机制来 修改类的私有域,由于修改类的私有域会破坏Java"封装"的特性,故请慎重操作. 主要技术:     Field类提供有关类或接口的单个字段的信息,以及对它的动态访问权限.     访问的字段可能是一个类(静态)字段或实例字段.             常

JAVA的反射机制学习笔记(二)

上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了,自己的步伐完全被打乱了~不能继续被动下去,得重新找到自己的节奏. 4.获取类的Constructor 通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 Class<T>类提供了几个方法获取类的构造器. public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反

【Java笔记】Java——远程监控、反射、代理、内省机制

远程控制的基本原理 远程控制(RemoteControl)拥有控制端和被控端双方. 控制方通过请求,取得对远端的操作,实现远端的事件回放功能,同时,应该看得到远端桌面的画面.而被控方必须在建立ServerSocket之后进行对外来请求的鉴听. 1 /** 2 * 客户端发送事件 3 * @param e 4 */ 5 public void sendEvent(InputEvent e){ 6 try { 7 SinglClient.getInstance().getOos().writeObj

Java笔记(9)

JSP 存在两种 开发模式 Model1 : JSP + JavaBean * 不适合开发业务逻辑特别复杂web应用 ----- 业务逻辑复杂,控制代码多,而在jsp中编写控制代码,十分不便 Model2 : JSP + JavaBean + Servlet 符合MVC设计模式 JSP(View视图功能):负责页面显示 JavaBean(Model 模型功能):负责数据封装和处理 Servlet(Controller 控制器功能):连接模型和视图,对整个业务流程进行控制,调用JavaBean封装

Java笔记(10)

第一天 ----- 第十天 知识点复习 day1 XML 语法和两种约束技术 1.XML语法写法.规范: 根元素必须唯一.元素名称与属性名称不能以数字开始.元素标记必须结束.元素不能交叉嵌套.属性值必须加引号(双引号.单引号) ----- 考试:排错 2.CDATA块 与 特殊字符转义在 使用上区别 ? <book> <p>标记的作用 </book>  ----- 标记内容 <p> 是一个特殊内容 CDATA : <book> <![CDA

java笔记整理

Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, Ejb, java和模式 Linux/Unix笔记 inode :存储编号(地址) ls -k:查看磁盘分区 ls -li:显示当前文件的inode号. 目录的大小跟文件的大小有关,跟目录里的文件(目录)数量无关. 一行多个命令的话,中间用分号分开.如:pwd;cal;date last | grep

Core Java 笔记

Core Java 的读书笔记,持续更新中... Core Java笔记 1.对象与类 Core Java笔记 2.继承 Core Java笔记 3.反射

java笔记--异常详解与处理

一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出.     2.只有此类或其子类才可以是catch字句中的参数类型.     3.有两个直接子类:Error和Exception         Error--指应用程序不应该去处理捕获的一种严重问题,常表示系统级的错误,如内存溢出        Exception--指程序需要捕获,需要处理的异常,是一种设计或实现方面的问题.  

Java 笔记(四) RTTI - 运行时类型检查

运行时类型检查,即Run-time Type Identification.这是Java语言里一个很强大的机制,那么它到底给我们的程序带来了什么样的好处呢? 在了解运行时类型检查之前,我们要首先知道另一个密切相关的概念,即运行时类型信息(Run-time Information - 也可以缩写为RTTI) 运行时类型信息使得你可以在程序运行时发现和使用类型信息. 来自:<Thinking in Java>. OK,那么我们总结来说,RTTI就是能够让我们在程序的运行时去获取类型的信息.接下来我