`
冯瑞芳
  • 浏览: 28782 次
  • 性别: Icon_minigender_2
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

反射总结

阅读更多

反射就是加载类,并解剖出类的各个组成部分。通俗的说反射就是通过一个文件来解析类。

一、要明白怎样加载类的方法,有三种:

1Class.forName(""),如:Class.forName("com.mysql.jdbc.Driver")

2对象.getClass() 如: Student st=new Student(); st.getClass()

3类名.class 如: Student.Class;

Class对象提供了如下常用方法:

二、获取加载类中所有的构造器

Public  Constructor  getConstructor(Class<?>... parameterTypes) 

Public  Method  getMethod(String name, Class<?>... parameterTypes) 

Public  Field  getField(String name)  

//以上三种可以解析 public类的构造器

//下面的三种方法是解析private类的构造器

public Constructor getDeclaredConstructor(Class... parameterTypes)

public Method getDeclaredMethod(String name,Class... parameterTypes)

public Field getDeclaredField(String name)

这些方法分别用于从类中解剖出构造函数、方法和成员变量(属性)。解剖出的成员分别使用Constructor、 Method 、 Field 对象表示。常用的是getConstructor()

三、创建类的实例

Constructor类提供了如下方法,用于创建类的对象

public Object newInstance(Object... initargs)initargs用于指定构造函数接收的参数调用对象的方法

四、调用对象的方法

首先以Student类举例如下

(1)、三种加载类的方法

public class StudentTest {

@Test

public void test() throws ClassNotFoundException {

// 1Class.forName("")加载类

Class cls = Class.forName("cn.csdn.reflect.Student");

System.out.println(cls);

// 2、对象.getClass()加载类

Student stu = new Student();

Class cls1 = stu.getClass();

System.out.println(cls1);

// 3、类名.class 加载类

Class cls2 = Student.class;

System.out.println(Student.class);

}

(2)、举例反射类无参、有参、私有的构造函数,创建类的对象,案例如下:首先创建一个普通的JavaStudent,该类位于cn.csdn.reflect包中并编译产生相应的class文件.下面就是该类中各种构造器解剖的方式如下:

// 解析:public Student()

@Test  //解析无参的构造函数

public void test1() throws ClassNotFoundException, SecurityException,

NoSuchMethodException, IllegalArgumentException,

InstantiationException, IllegalAccessException,

InvocationTargetException {

// 1、加载类

Class cls = Class.forName("cn.csdn.reflect.Student");

// 2、通过无参数的构造器解析

Constructor constructor = cls.getConstructor(null);

// 3、创建类的实例

Student entity = (Student) constructor.newInstance(null);

        //4、调用对象的方法

entity.study();

//解析:public Student(String name,int age);

@Test  //解析有参的构造函数

public void test2()throws Exception{

//1、加载类

Class cls = Class.forName("cn.csdn.reflect.Student");

//2、通过带有参数的构造器解析

Constructor constructor = cls.getConstructor(String.class,int.class);

//3、创建类实例

Student entity = (Student)constructor.newInstance("redarmy",90);

//4、调用方法

entity.study();

System.out.println(entity.getName());

}

//怎么知道 Student类中有哪些构造器

@Test

public void test3()throws Exception{

//1、加载类

Class cls = Class.forName("cn.csdn.reflect.Student");

//2、获取加载类中的所有的构造器

Constructor csr[] = cls.getConstructors();

//3、遍历构造器csr

for(Constructor c:csr){

//打印出构造器参数的类型及构造器名称

 System.out.println(c.toGenericString());

}

}

    //解析: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();

}

@Test  //解析私有的构造方法

public void test5()throws Exception{

//1、加载类

Class cls = Class.forName("cn.csdn.reflect.Student");

//2、根据构造器参数类型获取相应的构造器对象    

Constructor csr = cls.getDeclaredConstructor(List.class);

csr.setAccessible(true);//暴力

//3、创建实体对象

Student entity = (Student)csr.newInstance(new ArrayList());

//4、调用方法

entity.study();

}

}

多学一招sun公司为简化开发人员创建对象,它在class对象中也提供了一个newInstance方法,用于创建类的对象。这样开发人员可以避免每次都需要去反射Constructor 类以创建对象。

不过需要注意的是:class.newInstance方法内部是反射类无参的构造函数创建的对象,所以利用此种方式创建类对象时,类必须有一个无参的构造函数。

<!--EndFragment-->
分享到:
评论

相关推荐

    最全面的java反射总结

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心在于`java.lang.Class`类以及相关的类和接口,如`java.lang.reflect`包下...

    C#反射总结,包括实例和讲解

    【C#反射总结,包括实例和讲解】 C#中的反射是一种强大的编程技术,允许程序员在运行时检查和操作程序的元数据,如类型、方法、属性等。这使得代码能够动态地发现和交互未知类型的信息,增加了代码的灵活性和可扩展...

    C#反射总结

    #### 六、总结 反射作为.NET框架的一个重要特性,在开发过程中具有广泛的应用价值。它不仅可以帮助我们更好地理解程序集和类型的结构,还能实现动态创建和操作对象的功能,从而增强程序的灵活性和可扩展性。然而,...

    java中反射知识总结

    Java中的反射机制是Java语言一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java编程中,反射扮演着重要角色,尤其在动态加载类、创建对象、调用方法以及访问私有成员等...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    asp.net 反射总结

    ASP.NET中的反射是一种强大的编程技术,它允许程序在运行时检查和操作自身的元数据,即类型、成员和方法等信息。反射的核心在于.NET框架的`System.Reflection`命名空间,其中包含了一系列类,如`Assembly`、`...

    反射总结.xmind

    看教程写的反射基础总结,有兴趣的人可以看一下,有啥欠缺的地方请私信我

    java-反射总结【从入门到项目总结】

    关于java反射的总结: 从入门介绍到项目使用的实际经验归纳总结得出! 从jdk5到jdk8!

    java反射总结

    个人学习总结,java反射,思维导图 个人学习总结,java反射,思维导图

    JAVA中的反射机制(内含大量实例).doc

    #### 五、总结 Java中的反射机制是一个非常强大且有用的工具,它极大地增强了程序的灵活性和扩展性。通过理解和掌握反射机制,开发者可以更好地构建复杂和动态的应用程序。然而,在使用反射时也需要权衡其带来的...

    利用java反射机制的建议计算器源码

    在提供的`反射总结.doc`文件中,可能包含了关于反射机制更深入的理论知识和最佳实践,而`calc`可能是实现这个计算器项目的源代码文件。阅读和分析这些资源将进一步加深你对Java反射机制的理解。

    Java反射总结:入门进阶到使用

    本文将从基础到进阶,全面总结Java反射的使用。 **一、反射初识** 反射的核心在于Java运行时能动态地获取类的信息,包括类名、属性、方法、构造器等。通常,我们创建对象是通过类名直接new,而反射则是通过字符串...

    java反射总结实例详解

    Java反射是Java语言的一种强大的特性,它允许程序在运行时检查和操作类、接口、对象以及它们的属性和方法。本文将深入探讨Java反射的概念,通过实例解析如何使用反射来获取对象属性值,并介绍Class类、基本数据类型...

    java反射机制原理和反射机制总结

    总结,Java反射机制是Java平台灵活性和动态性的体现,它极大地扩展了Java程序的能力,但同时也需要谨慎使用,平衡好其带来的便利和潜在问题。学习和理解反射机制对于深入理解Java以及开发复杂系统至关重要。

    JAVA反射知识点总结

    本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。 文章目录一.反射的基本概念二.反射常用类三.使用反射的基本步骤四.Class类讲解(1)Class类是反射机制的起源和入口(2)Class类存放类的结构信息(3)...

    JAVA反射知识总结

    JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...

    Java反射机制总结(实例分析)

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...

    java反射知识总结

    ### Java反射知识总结 #### 一、反射的概念与意义 反射是Java中一项非常重要的特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象、调用方法等。这种能力使得Java程序具有了极大的灵活性,特别...

    Java反射机制学习总结

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...

Global site tag (gtag.js) - Google Analytics