java进阶三:反射

1、得到各个字节码对应的实例对象(Class类型)的三种方式,示例如下:

  类名.class,比如,System.class

  对象.getClass(),比如,new Date().getClass()

  Class.forName("类名"),比如,Class.forName("java.util.Date")

2、Constructor类的使用,Constructor类代表某个类中的一个构造方法

  得到某个类所有的构造方法:

    Constructor[] constructors=Class.forName("java.lang.String").getConstructors();

  得到某一个构造方法:

    Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);

  创建实例对象:

    普通方式:

    String str=new String(new StringBuffer("abc"));

    使用反射:

    Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);
            String str1=(String) constructor.newInstance(new StringBuffer("abc"));

直接使用Class.newInstance()方法:

  String str2=(String)Class.forName("java.lang.String").newInstance();

  该方法内部是先得到默认的构造方法,然后用该构造方法创建对象实例

3、Field类代表某个类中的一个成员变量,使用方法如下:

class Point{
    public int x;
    private int y;
    public Point() {}
    public Point(int x,int y){
        this.x=x;
        this.y=y;
    }
}

public class Demo01 {
    public static void main(String[] args) throws Exception {
        Point point=new Point(1,2);
        Field xField=Class.forName("com.ly.java.enhance.reflection.Point").getField("x");
        System.out.println(xField.get(point));     //得到私有属性
        Field yField=Class.forName("com.ly.java.enhance.reflection.Point").getDeclaredField("y");
        yField.setAccessible(true);
        System.out.println(yField.get(point));
    }
}

4、Method类代表某个类中的一个成员方法,使用方法如下:

  得到类中的某一个方法:

    Method charAt=Class.forName("java.lang.String").getMethod("charAt", int.class);

  调用类中的某一个方法:

    String str="abc";

    普通方式:System.out.println(str.charAt(1));

    使用反射:

    Method charAt=Class.forName("java.lang.String").getMethod("charAt", int.class);
         System.out.println(charAt.invoke(str, 1));

    

  

  

原文地址:https://www.cnblogs.com/hypnus-ly/p/8460555.html

时间: 2024-10-14 10:43:04

java进阶三:反射的相关文章

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

Java进阶(三十五)java int与integer的区别

Java进阶(三十五)java int与integer的区别 前言 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象. 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而integer 是后者(也就是一个类):因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为null. 2.初始化时: int i =1; Integer i= new In

Java进阶(三十一) Web服务调用

Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd503-68fc-4406-b8f2-5e90095be303/19b67e36aa2ccd19 查看代码之后,按照以往的服务调用方法实现,结果无法实现.很是费解,求教大师兄之后,问题,迎刃而解,只能说自己需要学习的地方还有很多. 完整代码如下: package plan.http.util; imp

Java进阶(三十二) HttpClient使用详解

Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性.因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入. 一.简介 HttpClient是A

java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(1)

java学习一段时间之后,大家可能经常会听到反射这个词,那么说明java已经学习到一个高一点的层次了.接下来我会一步步和大家一起揭开java高级特性反射的神秘面纱. 首先介绍下类对象这个概念,可能会经常用到这个概念: 类对象:java中有句很经典的话"万事万物皆对象",相信大家都不陌生,这句话告诉了我们java的特征之一,那就是面向对象.java中类的概念我们都很熟悉,既然万事万物皆是对象,那么类是谁的对象呢?<对象的概念:一个类的实例>换句话说,类是谁的实例.如此就有了类

Java 进阶 (三) JVM参数说明

1.JVM(Java Virtual Machine) 1.-Xms    初始堆大小 2.-Xmx    最大堆大小 3.-Xmn    青年代大小 4.-Xss    每个线程的堆栈大小 5.-XX:+UseParNewGC    青年代垃圾收集方式为并行收集 6.-XX:+UseParallelOldGC   老年代垃圾收集方式为并行收集 7.-XX:ParallelGCThreads    并行收集器的线程数(最好与处理器数目相等) 8.-XX:MaxGCPauseMillis    每

(转)Java进阶java int与Integer的区别

Java进阶java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象,用一个引用指向这个对象. 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而Integer 是后者(也就是一个类):因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为null. 2.初始化时: int i =1; Integer i= new Integer

JAVA进阶之旅(二)——认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践

JAVA进阶之旅(二)--认识Class类,反射的概念,Constructor,Fiald,Method,反射Main方法,数组的反射和实践 我们继续聊JAVA,这次比较有意思,那就是反射了 一.认识Class类 想要反射,你就必须要了解一个类--Class,我们知道,java程序中的各个java类都属于同一事物,我们通常用Classliability描述对吧,反射这个概念从JDK1.2就出来了,历史算是比较悠久了,这个Class可不是关键字哦,这个是一个类,他代表的是一类事物: 我们归根结底就

Java进阶之reflection(反射机制)——反射概念与基础

反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C.C++则不属于动态语言. 二.Java是动态语言吗? 从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和C.C++一样都不属于动态语言. 但是JAVA却又一个非常突出的与动态相关的机制:反射机制.