Java反射用法

Posted inotebook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射用法相关的知识,希望对你有一定的参考价值。

反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。

package com.demo.reflectTest;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import com.mysql.jdbc.Driver;

public class Test 

    public static void main(String[] args) 

        try 
            Driver driver = new Driver();
            // 用法一:通过一个对象获得完整的包名和类名
            System.out.println(driver.getClass());
            // 用法二:实例化Class类的对象
            Class<?> class1 = Class.forName("com.mysql.jdbc.Driver");
            Class<?> class2 = new Driver().getClass();
            Class<?> class3 = Driver.class;
            System.out.println(class1.getName());
            System.out.println(class2.getName());
            System.out.println(class3.getName());
            // 用法三:通过Class实例化其他无参构造类的对象
            Class<?> user = Class.forName("com.demo.reflectTest.User");
            User u = null;
            u = (User) user.newInstance();
            System.out.println(user.equals(u));
            // 用法四:通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)
            Constructor<?> cons[] = user.getConstructors();
            System.out.println(cons[0].getModifiers() + " "
                    + cons[0].toGenericString());
            User u0 = (User) cons[0].newInstance("root", "123456", 20);
            System.out.println(cons[1].getModifiers() + " "
                    + cons[1].toGenericString());
            User u1 = (User) cons[1].newInstance("admin", 23);
            System.out.println(cons[2].getModifiers() + " "
                    + cons[2].toGenericString());
            User u2 = (User) cons[2].newInstance("temp");
            // 用法五:返回一个类实现的接口
            Class<?> ins[] = user.getInterfaces();
            for (Class<?> c : ins) 
                System.out.println(c.getName());
            
            // 用法六:取得其他类中的父类
            System.out.println(user.getSuperclass());
            // 用法七:获得类的属性
            Field[] field = user.getDeclaredFields();
            for (Field f : field) 
                System.out.print(Modifier.toString(f.getModifiers()) + " ");
                System.out.print(f.getType() + " ");
                System.out.print(f.getName() + " ");
                System.out.println();
            
            // 用法八:通过反射调用其他类中的方法(JDK动态代理)
            Method method = user.getMethod("sayHello");
            method.invoke(user.newInstance());
            method = user.getMethod("sayWords", String.class);
            method.invoke(user.newInstance(), "World");
            // 用法九:调用其他类的set和get方法
            u = (User) user.newInstance();
            setter(u, "Password", "654321", String.class);
            getter(u, "Password");
            // 用法十:通过反射操作属性
            u = (User) user.newInstance();
            Field fd = user.getDeclaredField("username");
            fd.setAccessible(true);
            fd.set(u, "guest");
            System.out.println(fd.get(u));
            // 用法十一:通过反射取得并修改数组的信息
            int[] a =  5, 4, 3, 2, 1, 0 ;
            Class<?> array = a.getClass().getComponentType();
            System.out.println(array.getName());
            System.out.println(Array.getLength(a));
            System.out.println(Array.get(a, 2));
            Array.set(a, 0, 7);
            System.out.println(Array.get(a, 0));
            // 用法十二:通过反射修改数组大小
            int b[] =  1, 2, 3, 4 ;
            int newB[] = (int[]) arrayInc(b, 8);
            System.out.println(Arrays.toString(newB));
         catch (Exception e) 
            e.printStackTrace();
        
    

    private static Object arrayInc(Object o, int length) 
        // TODO 自动生成的方法存根
        Class<?> arr = o.getClass().getComponentType();
        Object newO = Array.newInstance(arr, length);
        int oldLength = Array.getLength(o);
        System.arraycopy(o, 0, newO, 0, oldLength);
        return newO;
    

    private static void getter(Object o, String att) 
        // TODO 自动生成的方法存根
        try 
            Method method = o.getClass().getMethod("get" + att);
            System.out.println(method.invoke(o));
         catch (Exception e) 
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        
    

    private static void setter(Object o, String att, Object value, Class<?> type) 
        // TODO 自动生成的方法存根
        Method method;
        try 
            method = o.getClass().getMethod("set" + att, type);
            method.invoke(o, value);
         catch (Exception e) 
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        
    

 

以上是关于Java反射用法的主要内容,如果未能解决你的问题,请参考以下文章

Java之反射 — 用法及原理

java反射的用法

Java反射机制

Java反射机制

Java反射超详解✌

不藏了,这些Java反射用法总结都告诉你们