码迷,mamicode.com
首页 > 编程语言 > 详细

Java反射用法

时间:2019-07-14 09:35:35      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:tco   处理   hello   代理   generics   其他   接口   nbsp   type   

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

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反射用法

标签:tco   处理   hello   代理   generics   其他   接口   nbsp   type   

原文地址:https://www.cnblogs.com/inotebook/p/11183084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!