反射就是加载类,并解剖出类的各个组成部分。通俗的说反射就是通过一个文件来解析类。
一、要明白怎样加载类的方法,有三种:
1、Class.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 {
// 1、Class.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)、举例反射类无参、有参、私有的构造函数,创建类的对象,案例如下:首先创建一个普通的Java类Student类,该类位于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方法内部是反射类无参的构造函数创建的对象,所以利用此种方式创建类对象时,类必须有一个无参的构造函数。
相关推荐
Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心在于`java.lang.Class`类以及相关的类和接口,如`java.lang.reflect`包下...
【C#反射总结,包括实例和讲解】 C#中的反射是一种强大的编程技术,允许程序员在运行时检查和操作程序的元数据,如类型、方法、属性等。这使得代码能够动态地发现和交互未知类型的信息,增加了代码的灵活性和可扩展...
#### 六、总结 反射作为.NET框架的一个重要特性,在开发过程中具有广泛的应用价值。它不仅可以帮助我们更好地理解程序集和类型的结构,还能实现动态创建和操作对象的功能,从而增强程序的灵活性和可扩展性。然而,...
Java中的反射机制是Java语言一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java编程中,反射扮演着重要角色,尤其在动态加载类、创建对象、调用方法以及访问私有成员等...
### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...
ASP.NET中的反射是一种强大的编程技术,它允许程序在运行时检查和操作自身的元数据,即类型、成员和方法等信息。反射的核心在于.NET框架的`System.Reflection`命名空间,其中包含了一系列类,如`Assembly`、`...
看教程写的反射基础总结,有兴趣的人可以看一下,有啥欠缺的地方请私信我
关于java反射的总结: 从入门介绍到项目使用的实际经验归纳总结得出! 从jdk5到jdk8!
个人学习总结,java反射,思维导图 个人学习总结,java反射,思维导图
#### 五、总结 Java中的反射机制是一个非常强大且有用的工具,它极大地增强了程序的灵活性和扩展性。通过理解和掌握反射机制,开发者可以更好地构建复杂和动态的应用程序。然而,在使用反射时也需要权衡其带来的...
在提供的`反射总结.doc`文件中,可能包含了关于反射机制更深入的理论知识和最佳实践,而`calc`可能是实现这个计算器项目的源代码文件。阅读和分析这些资源将进一步加深你对Java反射机制的理解。
本文将从基础到进阶,全面总结Java反射的使用。 **一、反射初识** 反射的核心在于Java运行时能动态地获取类的信息,包括类名、属性、方法、构造器等。通常,我们创建对象是通过类名直接new,而反射则是通过字符串...
Java反射是Java语言的一种强大的特性,它允许程序在运行时检查和操作类、接口、对象以及它们的属性和方法。本文将深入探讨Java反射的概念,通过实例解析如何使用反射来获取对象属性值,并介绍Class类、基本数据类型...
总结,Java反射机制是Java平台灵活性和动态性的体现,它极大地扩展了Java程序的能力,但同时也需要谨慎使用,平衡好其带来的便利和潜在问题。学习和理解反射机制对于深入理解Java以及开发复杂系统至关重要。
本文介绍了JAVA反射类的基本概念,欢迎阅读学习,一起进步。 文章目录一.反射的基本概念二.反射常用类三.使用反射的基本步骤四.Class类讲解(1)Class类是反射机制的起源和入口(2)Class类存放类的结构信息(3)...
JAVA反射知识总结涉及到的主要知识点包括: 1. 反射的基本概念: 反射是Java语言中的一个特性,允许程序在运行期间动态地访问和操作类、方法、成员变量等组件。通过反射,可以突破访问控制,动态创建对象,调用方法...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...
### Java反射知识总结 #### 一、反射的概念与意义 反射是Java中一项非常重要的特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象、调用方法等。这种能力使得Java程序具有了极大的灵活性,特别...
Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...