博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java_反射
阅读量:5934 次
发布时间:2019-06-19

本文共 6102 字,大约阅读时间需要 20 分钟。

反射1

    反射的概念
    反射能实现的功能
    Class类详解
    
    反射的概念
        Reflection,它是一种在程序运行时可以将其状态作为数据进行查询与修改的能力。
        java语言对查询支持更好,别的语言也支持反射。java对修改支持不是很好。
    反射能实现的功能
        有类名,可以获取:
        有引用,可以
    Class类详解
        反射的核心
        该类来自java.lang包,而且是一个泛型类
        在运行时可以使用它发现类的所有信息
        一个jvm中每一个加载的类只会有一个Class对象
        
        获取Class的实例
            类的class静态属性(字面量)
            实例的getClass()方法
            使用其静态方法forName()方法

 

package java20180205_2;class User {    static {        System.out.println("user init ...");    }}public class ReflectionDemo1 {    static void create1() {        new User();    }    static void create2() {        Class
c = User.class; } static void create3() { try { Class c = Class.forName("java20180205_2.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } static void create4() { try { Class c = Class.forName("java20180205_2.User", false, ReflectionDemo1.class.getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { create4(); /** * 第一种方法 */ Class
c1 = String.class; /** * 第二种方法 */ String s = ""; Class
c2 = s.getClass(); /** * 第三种方法 */ try { Class
c3 = Class.forName("java.lang.String"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }}

 

反射2

    获取包的信息
    获取类的信息
    获取属性的信息
    
    
    获取包的信息
        java.lang.Package
        
        String getName()
        static Package getPackage(String name)
        static Package[] getpackage()
    获取属性的信息
        java.lang.reflect.Field
        
        Field[] getFields()//得到的是所有的public属性
        Field[] getDeclaredFields()//得到所有但不包括继承而来的
        Field getField(String name)
        Field getDeclaredField(String name)

 

获取包及类信息

package java20180205_2;import java.io.Serializable;import java.lang.reflect.Modifier;abstract class Person extends Thread implements Serializable,Runnable{    }public class PackageInfo {    public static void main(String[] args) {////        Package p=Package.getPackage("java.lang");//        System.out.println(p.getName());                Package[] ps=Package.getPackages();        for (Package p1 : ps) {                    System.out.println(p1.getName());        }        System.out.println("============================");        Class
c1=Person.class; //下面是全限定名 System.out.println(c1.getName()); //下面只有类名 System.out.println(c1.getSimpleName()); System.out.println(c1.getPackage().getName()); System.out.println(c1.isPrimitive()); System.out.println(c1.isInterface()); System.out.println(int.class.isPrimitive()); System.out.println("============================"); //得到类本身的信息及父类和父接口的信息 Class
sc=c1.getSuperclass(); System.out.println(sc.getName()); Class
[] sc1=c1.getInterfaces(); for (Class
class1 : sc1) { System.out.println(class1.getName()); } System.out.println("============================");// int mod=c1.getModifiers(); int mod=Serializable.class.getModifiers(); System.out.println(Modifier.toString(mod)); System.out.println(c1.toGenericString()); }}

 

获取字段信息

package java20180205_2;import java.lang.reflect.Field;interface interface1{    int NUM=10;}class class1{    int num1;    public String name;}class MyClass extends class1 implements interface1{    int num2;    public int num3;    private int num4;}public class FieldInfo {    public static void main(String[] args) {        Class
c=MyClass.class; Field[] fields=c.getFields(); for (Field field : fields) { System.out.println(field.getName()); } System.out.println("==================="); Field[] fields2=c.getDeclaredFields(); for (Field field : fields2) { System.out.println(field.getName()); } System.out.println("==================="); try { Field field3=c.getField("NUM1"); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } System.out.println("==================="); try { Field field4=c.getDeclaredField("num2"); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } }}

 

反射3

    获取方法的信息
    获取构造方法的信息
    
    java.lang.reflect.Method
    
    Method[] getMethods()
    Method[] getDeclaredMethods()
    Method getMethod(String name,Class... parameterTypes)
    Method getDeclaredMethod(String name,Class... parameterTypes)

package java20180205_2;import java.lang.reflect.Constructor;import java.lang.reflect.Method;abstract class Class2{    public Class2(){            }    public void m1(){    }    public void m1(int num,String str){            }    void m2(){    }    static void m3(){    }    abstract void m4();}public class MethodInfo {    public static void main(String[] args) {        Class
c1=Class2.class; //得到这个类中所有public的方法,默认的与private的都不行 Method[] m1=c1.getMethods(); for (Method method : m1) { System.out.println(method.getName()); } System.out.println("=============="); //得到这个类中所有声明的方法 Method[] m2=c1.getDeclaredMethods(); for (Method method : m2) { System.out.println(method.getName()); } System.out.println("=============="); try {// Method c2=c1.getDeclaredMethod("m1");// Method c2=c1.getDeclaredMethod("m1",int.class); Method c2=c1.getDeclaredMethod("m1",int.class,String.class); System.out.println(c2.getName()); } catch (NoSuchMethodException | SecurityException e) { e.printStackTrace(); } System.out.println("=============="); Constructor
[] c3=c1.getConstructors(); for (Constructor
constructor : c3) { System.out.println(constructor.getName()); System.out.println(constructor.getModifiers()); } }}

 

       

反射4
    通过反射创建对象
    调用对象的方法
    调用对象的属性
       

 

转载于:https://www.cnblogs.com/createyuan/p/8421190.html

你可能感兴趣的文章
SpringCloud(第 006 篇)电影微服务,使用 Ribbon 在客户端进行负载均衡
查看>>
深入理解Memcache
查看>>
SpringCloud(第 041 篇)链接Mysql数据库,通过JdbcTemplate编写数据库访问
查看>>
CSS 属性赋值
查看>>
ionic3,nodejs,MongoDB搭建一个移动端APP
查看>>
【推荐】jquery开发的大型web应用—H5编辑器工具
查看>>
CentOS安装Python3
查看>>
redis常用命令
查看>>
【Vue实例】
查看>>
20170808 - 跨浏览器的事件兼容处理程序
查看>>
JavaScript this 从此不再疑惑
查看>>
【阅读笔记】Web安全深度剖析
查看>>
微信小程序中使用emoji表情相关
查看>>
浏览器端Event loop简介
查看>>
在 Node.js 中用 pipe 处理数组的实现
查看>>
Web开发中常见的认证机制
查看>>
[译] 设计一个现代的缓存
查看>>
nodejs微信公众号开发——0.起手式
查看>>
Learn Spring - Spring DAO
查看>>
移动APP测试之安全性测试策略分析
查看>>