linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux基础建设 >

Java基础知识之反射机制

时间:2017-07-28  来源:未知  作者:admin666

1、什么是反射机制

Java的反射机制是在运行中的,可以通过反射机制获取(知道)一个类中的所有方法和属性,对于任意一个类,也可以通过反射机制得到(调用)一个对象中的所有方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2、反射机制能做什么
反射机制主要提供了以下功能:

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

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

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

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

生成动态代理。

3、反射机制的相关方法

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

package com.reflect;
public class TestReflect {
    public static void main(String[] args) throws Exception{<br>
        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();
            }
        }
    }

友情链接
  • Mozilla发布Firefox 67.0.4,修复沙箱逃逸漏洞
  • 蚂蚁金服正式成为CNCF云原生计算基金会黄金会员
  • Firefox 68将采用Microsoft BITS安装更新
  • OpenSSH增加对存储在RAM中的私钥的保护
  • 谷歌想实现自己的curl,为什么?
  • Raspberry Pi 4发布:更快的CPU、更大的内存
  • Firefox的UA将移除CPU架构信息
  • Ubuntu放弃支持32位应用程序实属乌龙,Steam会否重回Ubuntu怀抱
  • Qt 5.13稳定版发布:引入glTF 2.0、改进Wayland以及支持Lottie动
  • 红帽企业Linux 7现已内置Redis 5最新版
  • Slack进入微软内部禁用服务清单,GitHub也在其列?
  • 安全的全新编程语言V发布首个可用版本
  • Windows Terminal已上架,快尝鲜
  • 阿里巴巴微服务开源生态报告No.1
  • 面世两年,Google地球将支持所有基于Chromium的浏览器
  • 推进企业容器化持续创新,Rancher ECIC千人盛典完美收官
  • CentOS 8.0最新构建状态公布,或于数周后发布
  • Debian移植RISC
  • 微软拆分操作系统的计划初现雏形
  • Oracle发布基于VS Code的开发者工具,轻松使用Oracle数据库
  • Ubuntu 19.10停止支持32位的x86架构
  • 微软为Windows Terminal推出全新logo
  • 联想ThinkPad P系列笔记本预装Ubuntu系统
  • 微软发布适用于Win7/8的Microsoft Edge预览版
  • 启智平台发布联邦学习开源数据协作项目OpenI纵横
  • 经过六个多月的延迟,微软终于推出Hyper
  • ZFS On Linux 0.8.1 发布,Python可移植性工作
  • DragonFly BSD 5.6.0 发布,HAMMER2状态良好
  • Linux Kernel 5.2
  • CentOS 8.0 看起来还需要几周的时间
  • 百度网盘Linux版正式发布
  • PCIe 6.0宣布:带宽翻倍 狂飙至256GB/s
  • PHP 7.4 Alpha 发布,FFI扩展,预加载Opcache以获得更好的性能
  • Canonical将在未来的Ubuntu版本中放弃对32位架构的支持
  • Scala 2.13 发布,改进的编译器性能
  • 微软的GitHub收购了Pull Panda,并且使所有订阅完全免费
  • Windows Subsystem for Linux 2 (WSL 2)现在适用于Windows 10用
  • Debian 10 “Buster”的RISC
  • MariaDB宣布发布MariaDB Enterprise Server 10.4
  • DXVK 1.2.2 发布,带来微小的CPU开销优化
  • DragonFlyBSD 5.6 RC1 发布,VM优化,默认为HAMMER2
  • PrimeNG 8.0.0 发布,支持Angular 8,FocusTrap等
  • GIMP 2.10.12 发布,一些有用的改进
  • 清华大学Anaconda 镜像服务即将恢复
  • Debian GNU/Linux 10 “Buster” 操作系统将于2019年7月6日发布
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载