zoukankan      html  css  js  c++  java
  • Java基础之反射机制

    1、什么是反射机制

      Java的反射机制是在运行中的,可以通过反射机制获取(知道)一个类中的所有方法和属性,对于任意一个类,也可以通过反射机制得到(调用)一个对象中的所有方法和属性;

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

    2、反射机制能做什么

    反射机制主要提供了以下功能: 

    • 在运行时,判断任意一个对象,它所属的类是哪一个;

    • 在运行时,可以构造(创建)任意一个类的对象;

    • 在运行时,判断任意一个类,它所具有的成员变量和方法;

    • 在运行时,可以调用任意一个对象的方法;

    • 生成动态代理。

    3、反射机制的相关方法

      1.通过一个对象获得完整的包名和类名

    package com.reflect;
    public class TestReflect {
    	public static void main(String[] args) throws Exception{
    TestReflect testReflect = new TestReflect(); System.out.println(testReflect.getClass().getName());// 结果 com.reflect.TestReflect } }

      2.实例化Class类对象

    package com.reflect;
    
    public class TestReflect {
    
    	public static void main(String[] args) throws Exception{
    
    		Class<?> class1 = null;
                    Class<?> class2 = null;
                    Class<?> class3 = null;
    
                     // 一般采用这种形式(实例化Class类对象)
                   class1 = Class.forName("com.reflect.TestReflect");
                   class2 = new TestReflect().getClass();
                   class3 = TestReflect.class;
    
                   System.out.println("类名称   " + class1.getName());
                   System.out.println("类名称   " + class2.getName());
                   System.out.println("类名称   " + class3.getName());
                  //三条的打印结果都是:类名称   com.reflect.TestReflect
    	}    
    }
    

      3.获取一个对象的父类与实现的接口

    package com.reflect;
    
    import java.io.Serializable;
    
    public class TestReflect implements Serializable {
    
    
    	private static final long serialVersionUID = -2862585049955236662L;
    	public static void main(String[] args) throws Exception {
    	        Class<?> clazz = Class.forName("com.reflect.TestReflect");
    	        // 取得父类
    	        Class<?> parentClass = clazz.getSuperclass();
    	        System.out.println("clazz的父类为:" + parentClass.getName());// clazz的父类为: java.lang.Object
    
    	        // 获取所有的接口
    	        Class<?> intes[] = clazz.getInterfaces();
    	        for (int i = 0; i < intes.length; i++) {
    	            System.out.println("clazz实现的接口有:"+(i + 1) + ":" + intes[i].getName());//clazz实现的接口有:1:java.io.Serializable
    	        }
    	}
    }

      4、获取某个类的全部属性

    package com.reflect;
    
    import java.io.Serializable;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    
    public class TestReflect implements Serializable {
    
    
           private static final long serialVersionUID = -2862585049955236662L;
    	    public static void main(String[] args) throws Exception {
    	    	Class<?> clazz = Class.forName("com.reflect.TestReflect");
    	        // 取得本类的全部属性
    	        Field[] field = clazz.getDeclaredFields();
    	        for (int i = 0; i < field.length; i++) {
    	            // 权限修饰符
    	            int mo = field[i].getModifiers(); //==26
    	            String priv = Modifier.toString(mo); //==private static final
    	            // 属性类型
    	            Class<?> type = field[i].getType();
    	            System.out.println(priv + "----- " + type.getName() + " ----" + field[i].getName());
                  //==private static final----- long ----serialVersionUID; } // 取得实现的接口或者父类的属性 Field[] filed1 = clazz.getFields(); for (int j = 0; j < filed1.length; j++) { // 权限修饰符 int mo = filed1[j].getModifiers(); String priv = Modifier.toString(mo); // 属性类型 Class<?> type = filed1[j].getType(); System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";"); } } }

      

     5、获取某个类的全部方法

    package com.reflect;
    
    import java.io.Serializable;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    
    
    /**
     * java的反射机制
     * @author hejinjin
     *
     */
    public class TestReflect implements Serializable {
    
    
    		private static final long serialVersionUID = -2862585049955236662L;
    	    public static void main(String[] args) throws Exception {
    	    	Class<?> clazz = Class.forName("com.reflect.TestReflect");
    	        Method method[] = clazz.getMethods();
    	        for (int i = 0; i < method.length; ++i) {
    	            Class<?> returnType = method[i].getReturnType();
    	            Class<?> para[] = method[i].getParameterTypes();
    	            int temp = method[i].getModifiers();
    	            System.out.print(Modifier.toString(temp) + " ");
    	            System.out.print(returnType.getName() + "  ");
    	            System.out.print(method[i].getName() + " ");
    	            System.out.print("(");
    	            for (int j = 0; j < para.length; ++j) {
    	                System.out.print(para[j].getName() + " " + "arg" + j);
    	                if (j < para.length - 1) {
    	                    System.out.print(",");
    	                }
    	            }
    	            Class<?> exce[] = method[i].getExceptionTypes();
    	            if (exce.length > 0) {
    	                System.out.print(") throws ");
    	                for (int k = 0; k < exce.length; ++k) {
    	                    System.out.print(exce[k].getName() + " ");
    	                    if (k < exce.length - 1) {
    	                        System.out.print(",");
    	                    }
    	                }
    	            } else {
    	                System.out.print(")");
    	            }
    	            System.out.println();
    	        }
    	    }
    	}
    

      

  • 相关阅读:
    Maven安装与配置
    win10更新后程序路径盘符变成*星号解决方法
    谈谈 CSS 关键字 initial、inherit 和 unset
    用 async/await 来处理异步
    Vuex
    HTML5新特性之文件和二进制数据的操作 Blob对象
    vue中class和内联style绑定
    Petya and Staircases CF212div.2B
    CF#212 Two Semiknights Meet
    HDU1423最长上升公共子序列
  • 原文地址:https://www.cnblogs.com/MoreThinking/p/7090976.html
Copyright © 2011-2022 走看看