`
linweibin
  • 浏览: 32453 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

java 反射初探(1)

阅读更多

            从接触java开始,很少使用过反射,记得只有在去年做一个舆情项目的时候,用反射做过一个代理模式来判断抓取的哪个网站的数据。先说说自己对反射的理解吧。

            反射的原理:

                JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
这个是从网站上粘的,是比较官方的定义。但是很抽象很笼统,我自己的理解是:反射就是程序在编译时并不知道此类,也就是不会将此类加载到内存(有关java类加载的理解以后会增加),当程序运行到此处时,才加载此类,探知它的结构。从而可以实例化对象,调用方法。
我理解的反射的好处有以下这么几个:
(1)在设计通用类时可以使用,比如在JDBC时,javabean与数据库的字段之间如果是一一对应的,则可以用反射设计通用的方法,实现对数据库的操作。可以大大减少重复代码。
(2)反射用在代理模式时可以大大减小耦合度。例如,在dao层,对数据的持久化可以采用jdbc,ibatis,hibernate等多种方法,业务层可以通过配置文件来获取使用哪个类,从而可以动态的加载该类,从而实例化该类对象。在以后变更持久层接口是只需要重写配置文件,不需要重新修改代码,然后卸载和安装。
(3)很多设计框架都使用了反射技术,比如spring,struts2 等,对于android开发,反射技术显得更加重要。
下面开始说说反射的基础api:
根据自己的理解和网上的很多资料,总结出使用反射主要的是关注:构造器,成员变量和成员方法。构造器产生实例对象,成员变量为该对象赋予属性,方法为该对象赋予行为。
(1)获取Class类对象:所有类其实都是Class的实例。
class Demo{
    //codes...
}
 
class Test{
    public static void main(String[] args) {
        Class<?> demo1=null;
        Class<?> demo2=null;
        Class<?> demo3=null;
        try{
            //一般尽量采用这种形式
            demo1=Class.forName("Reflect.Demo");
        }catch(Exception e){
            e.printStackTrace();
        }
        demo2=new Demo().getClass();//通过类的对象获取该类的Class实例
        demo3=Demo.class;//通过类获取它的Class实例
         
        System.out.println("类名称   "+demo1.getName());
        System.out.println("类名称   "+demo2.getName());
        System.out.println("类名称   "+demo3.getName());
         
    }
}
            (2)通过无参构造器实例化类对象
Class<?>demo=Class.forName('包名.Demo'); 
Object obj=demo.newInstance();
 如果此Demo定义时取消了无参构造器,也就是说有有参构造器没有无参构造器,则会出现java.lang.InstantiationException异常;
 
     (3) 构造器
           
package Reflect;

import java.lang.reflect.Constructor;

class Person{
     
    public Person() {
         
    }
    public Person(String name){
        this.name=name;
    }
    public Person(int age){
        this.age=age;
    }
    public Person(String name, int age) {
        this.age=age;
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString(){
        return "["+this.name+"  "+this.age+"]";
    }
    private String name;
    private int age;
}
 
public class Test{
    public static void main(String[] args) {
        Class<?> demo=null;
        try{
            demo=Class.forName("Reflect.Person");
        }catch (Exception e) {
            e.printStackTrace();
        }
        Person per1=null;
        Person per2=null;
        Person per3=null;
        Person per4=null;
        Person per5=null;
        try{
        Constructor<?> cons[]=demo.getConstructors();  //取得全部的构造函数
        Constructor<?>con=demo.getConstructor(new Class[]{String.class});//取得某一个构造函数
            per1=(Person)cons[0].newInstance();
            per2=(Person)cons[1].newInstance("Rollen");
            per3=(Person)cons[2].newInstance(20);
            per4=(Person)cons[3].newInstance("Rollen",20);
            per5=(Person)con.newInstance(new Object[]{"某个构造函数"});
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println(per1);
        System.out.println(per2);
        System.out.println(per3);
        System.out.println(per4);
        System.out.println(per5);
    }
}
其他的api将会在下一篇博客中详细介绍
分享到:
评论

相关推荐

    Java高级编程课程思政案例教学初探.zip

    1. 案例导入:选取与Java技术相关的社会热点事件,如信息安全、大数据隐私保护等,引导学生探讨技术背后的社会伦理和法律法规问题。 2. 情境模拟:设计一些情境,让学生站在不同的角色立场,如开发者、用户、管理者...

    C# 通过反射初探ORM框架的实现原理(详解)

    C# 通过反射初探ORM框架的实现原理 在本文中,我们将探讨C# 通过反射初探ORM框架的实现原理。ORM框架是Object-Relational Mapping的缩写,主要用来实现对象和关系数据库之间的映射。在Java中,我们经常使用Mybatis...

    Java-program-design-.rar_Java 8

    压缩包可能还涵盖了异常处理、类和对象、继承、接口、抽象类、访问修饰符、封装、构造器、集合框架(List、Set、Map)、IO流、反射、枚举、泛型等Java 8的关键特性。 每个章节都会通过实例和练习帮助学习者巩固所...

    first:2015 年 IT 学校练习

    【标题】2015年IT学校练习:Java编程初探 在2015年的IT教育领域,Java编程语言以其强大的跨平台能力和丰富的库支持,成为许多学习者入门编程的首选。本练习旨在帮助学生熟悉Java语言的基础概念,掌握编程的基本技能...

    Ioc注入讲解

    这通常是通过Java的反射机制来实现的。反射提供了在运行时动态访问和操作类的能力,主要包括以下几个方面: - **Class对象**:可以通过类名或者实例来获取一个类的Class对象,进而访问该类的所有信息。 - **...

    monte-carlo-raytracer

    《基于Java的Monte Carlo光线追踪器初探》 光线追踪是一种高级的计算机图形学技术,用于模拟光在三维空间中的传播,以生成逼真的图像。Monte Carlo光线追踪是光线追踪的一种方法,它利用随机采样技术来解决复杂的...

    DLP_Repository:DLP(编程语言设计)实践的存储库

    DLP_Repository是一个专注于编程语言设计实践的存储库,主要以Java编程语言为载体进行讨论和实现。...无论是对Java编程语言的深度挖掘,还是对编程语言设计的初探,DLP_Repository都是一个宝贵的资源。

    qt学习之路.pdf

    在Java中,GUI是其标准库的一部分,而对于C++来说,GUI编程并非标准内容。因此,对于C++开发者来说,需要依赖第三方库来完成GUI的开发。本书推荐的Qt框架,是C++开发者广泛使用的一个跨平台GUI开发库。 2. Hello, ...

Global site tag (gtag.js) - Google Analytics