`
Longmanfei
  • 浏览: 48378 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

漫谈反射机制(一)

 
阅读更多

 

 


首先我们先介绍三种加载类的方法,再反射中我们首选第一种,因为我们不知道他的类里有什么,值知道其路径

// 首先加载类
Class cls = Class.forName("cn.csdn.reflect.Student");
// 2、加载类
Student stu = new Student();
Class cls1 = stu.getClass();
System.out.println(cls1);

// 3、加载类
Class cls2 = Student.class;
System.out.println(Student.class);
下面我们来说如何去解析一个类,首先我们去加载类(定义一个Student.class)
Class cls = Class.forName("cn.csdn.reflect.Student");
// 2、通过无参数的构造器解析
Constructor constructor = cls.getConstructor(null);
// 3、创建类的实例
Student stu = (Student) constructor.newInstance(null);
// 4、调用对象的方法
stu.test();
上面是解析没有参数的类的方法,下面我们来解析还有参数的方法同上步骤,代码如下:
Class cls=Class.forName("cn.csdn.reflect.Student"); Constructor constructor=cls.getConstructo(String.class,int.class);
Student entity = (Student)constructor.newInstance("redarmy",90);
//4、调用方法
entity.study();
System.out.println(entity.getName());
下面我们介绍一下关于反射中传值引起的异常(引用redarmy 老师的)

1、错误bug   
java.lang.IllegalArgumentException: wrong number of arguments 
异常引起的原因分析:   
  
引起错误的原码:   
public Student(String strs[]){   
        System.out.println(strs.length);   
    }   
  
执行代码:   
   //解析:public cn.csdn.reflect.Student(java.lang.String[])   
    @Test  
    public void test4()throws Exception{   
        //1、加载类   
        Class cls = Class.forName("cn.csdn.reflect.Student");   
        //2、根据构造器参数类型获取相应的构造器对象       
        Constructor csr = cls.getConstructor(String[].class);   
        //3、创建实体对象   
        Student entity = (Student)csr.newInstance(new String[]{});   
        //4、调用方法   
        entity.study();   
    }   
编译环境:jdk1.6  
  
错误分析:由于Student(String strs[])构造器只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传 给对象strs,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一  个Object对象就可以解决这个异常了,   
  
解决方案:   
  //解析:public cn.csdn.reflect.Student(java.lang.String[])   
    @Test  
    public void test4()throws Exception{   
        //1、加载类   
        Class cls = Class.forName("cn.csdn.reflect.Student");   
        //2、根据构造器参数类型获取相应的构造器对象       
        Constructor csr = cls.getConstructor(String[].class);   
           
        String str[]={"111","123"};   
        //3、创建实体对象   
        Student entity = (Student)csr.newInstance((Object)str);   
        //4、调用方法   
        entity.study();   
    }  
 

 

 

分享到:
评论

相关推荐

    Java安全漫谈 - 01.反射篇(1)1

    Java 反射机制安全漫谈 Java 反射机制是 Java 语言中的一种强大功能,允许程序在运行时访问和修改类的信息。然而,这种功能也引入了安全隐患。本文将讨论 Java 反射机制的安全问题,重点介绍反射机制的基本概念、...

    Java安全漫谈 - 03.反射篇(3)1

    Java安全漫谈 - 反射篇(3)深入讲解了如何在Java中通过反射机制处理可变长参数和访问私有方法。反射是Java中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法,极大地增强了代码的灵活性。然而,这...

    Java安全漫谈 - 02.反射篇(2)1

    Java反射机制是Java提供的一种强大的动态类型功能,允许程序在运行时检查类的信息并操作类的对象。在Java安全领域,反射常被用于漏洞利用和代码审计。本文将深入探讨Java反射在安全方面的应用,特别是针对类的加载、...

    P神-Java安全漫谈

    Java安全是指在Java编程和应用开发过程中采取的一系列措施,旨在保护Java应用程序、系统和数据免受恶意攻击、数据泄露和其他安全威胁的影响。Java安全主要涉及以下几个方面: 代码安全性:Java提供了强大的安全机制...

    射频识别技术漫谈

    RFID标签内含电子芯片和天线,芯片内存储有唯一识别码以及其他信息,天线用于接收来自阅读器发出的射频信号,并反射回携带数据的信号给阅读器。阅读器的主要任务是发射射频信号,激活标签并读取数据,然后将数据传送...

    Java安全漫谈-知识星球代码审计

    反射是Java提供的一种强大机制,允许程序在运行时动态地获取类的信息并调用方法。然而,不当使用反射可能导致安全漏洞,如权限绕过、敏感信息泄露等。资料中《01.反射篇(1).pdf》、《02.反射篇(2).pdf》和《03.反射...

    Java安全漫谈与java代码审计学习知识库

    Java安全漫谈与Java代码审计是开发者在进行Java应用程序开发时必须关注的重要领域。Java作为广泛应用的编程语言,其安全性直接影响到系统稳定性和用户数据安全。以下是对标题和描述中涉及知识点的详细解释: 1. **...

Global site tag (gtag.js) - Google Analytics