「java反射创建方法」java反射使用方法

博主:adminadmin 2022-11-26 08:12:08 79

本篇文章给大家谈谈java反射创建方法,以及java反射使用方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java创建对象的几种方式

1.使用 new 的方式,这也是我们最常见的一种方式 我们以 Person 类来举例说明 例:

Person p = new Person();

2.使用反射来创建对象 我们可以调用 class类 或者 Constructor类的newInstance() 方法 例:

Person p1 = Person.class.newInstance();

3.使用克隆的方式 调用对象的 clone() 方法 例:

Person p4 = (包名.Person) p.clone();

4.使用反序列化的方式 我们需要让我们的类实现Serializable接口 例:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));

Person p5 = (Person ) in.readObject()

请问java中的反射机制与用法

Java中反射常用知识:

1. 要想使用反射,首先需要获得待处理类或对象所对应的Class对象。

2. 获取某个类或某个对象所对应的Class对象的常用的3种方式:

a) 使用Class类的静态方法forName:Class.forName(“java.lang.String”);

b) 使用类的.class语法:String.class;

c) 使用对象的getClass()方法:String s = “aa”; Class? clazz = s.getClass();

3. 若想通过类的不带参数的构造方法来生成对象,我们有两种方式:

a) 先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:

Class? classType = String.class;

Object obj = classType.newInstance();

b) 先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成:

Class? classType = Customer.class;

Constructor cons = classType.getConstructor(new Class[]{});

Object obj = cons.newInstance(new Object[]{});

4. 若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:

Class? classType = Customer.class;

Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});

Object obj = cons.newInstance(new Object[]{“hello”, 3});

5. Integer.TYPE返回的是int,而Integer.class返回的是Integer类所对应的Class对象。

如何利用java的反射机制动态创建对象

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。当然反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。

Java反射机制主要提供下面几种用途:

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法

在运行时调用任意一个对象的方法

以下,我们就以动态创建对象为例,通过代码来解释一下反射:

public class ReflectionTest {

public static void main(String[] args) throws Exception {

// 建立学生对象

Student student = new Student();

// 为学生对象赋值

student.setStuName("Wanggc");

student.setStuAge(24);

// 建立拷贝目标对象

Student destStudent = (Student) copyBean(student);

// 输出拷贝结果

System.out.println(destStudent.getStuName() + ":"

+ destStudent.getStuAge());

}

/**

* 拷贝学生对象信息。

*

* @param from

拷贝源对象

* @param dest

拷贝目标对象

* @throws Exception

例外

*/

private static Object copyBean(Object from) throws Exception {

// 取得拷贝源对象的Class对象

Class? fromClass = from.getClass();

// 取得拷贝源对象的属性列表

Field[] fromFields = fromClass.getDeclaredFields();

// 取得拷贝目标对象的Class对象

Object ints = fromClass.newInstance();

for (Field fromField : fromFields) {

// 设置属性的可访问性

fromField.setAccessible(true);

// 将拷贝源对象的属性的值赋给拷贝目标对象相应的属性

fromField.set(ints, fromField.get(from));

}

return ints;

}

}

java反射机制详解

反射就是把Java的各种成分映射成相应的Java类。

Class类的构造方法是private,由JVM创建。

反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。(来自Sun)

JavaBean 是 reflection 的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。

反射是从1.2就有的,后面的三大框架都会用到反射机制,涉及到类"Class",无法直接new CLass(),其对象是内存里的一份字节码.

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

基本的 Java类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。Class 没有公共构造方法。

Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

Person p1 = new Person();

//下面的这三种方式都可以得到字节码

CLass c1 = Date.class();

p1.getClass();

//若存在则加载,否则新建,往往使用第三种,类的名字在写源程序时不需要知道,到运行时再传递过来

Class.forName("java.lang.String");

Class.forName()字节码已经加载到java虚拟机中,去得到字节码;java虚拟机中还没有生成字节码 用类加载器进行加载,加载的字节码缓冲到虚拟机中。 

另外,大家可以关注微信公众号Java技术栈回复:JVM,获取我整理的系列JVM教程,都是干货。

考虑下面这个简单的例子,让我们看看 reflection 是如何工作的。

import java.lang.reflect.*;

public class DumpMethods {

public static void main(String args[]) {

try {

Class c = Class.forName("java.util.Stack");

Method m[] = c.getDeclaredMethods();

for (int i = 0; i m.length; i++)

System.out.println(m[i].toString());

}

catch (Throwable e){

System.err.println(e);

}

}

}

public synchronized java.lang.Object java.util.Stack.pop()

public java.lang.Object java.util.Stack.push(java.lang.Object)

public boolean java.util.Stack.empty()

public synchronized java.lang.Object java.util.Stack.peek()

public synchronized int java.util.Stack.search(java.lang.Object)

这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。

以下示例使用 Class 对象来显示对象的类名:

void printClassName(Object obj) {

System.out.println("The class of " + obj +

" is " + obj.getClass().getName());

}

还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class 对象。例如:

System.out.println("The name of class Foo is: "+Foo.class.getName());

在没有对象实例的时候,主要有两种办法。

//获得类类型的两种方式

Class cls1 = Role.class;

Class cls2 = Class.forName("yui.Role");

注意第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。现在得到cls1就可以创建一个Role类的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。

Object o = cls1.newInstance();

//创建一个实例

//Object o1 = new Role(); //与上面的方法等价

什么是反射?什么Java反射?

java反射是什么意思呢?下面带大家了解一下。

JAVA反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。反射是一种强大的工具,能够创建灵活的代码,可以使代码在运行时装配,无需在组件之间进行源代表链接。

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

反射适合用在哪

首先我们先思考一个问题,反射适合使用在哪里呢?从功能上看,反射似乎无所不能,几乎所有的类,所有的属性、方法、构造我们都能使用,但是我们细细思考一下,在实际开发中,并不是所有场景都需要使用反射获取属性或者方法进行操作,反而更多的使用实例.xxx方式操作,而当这些操作重复次数较多的时候,我们往往会考虑优化代码,减少代码冗余,提高复用,比如实体构建赋值等操作,这个时候往往是我们最需要复用的地方,所以我们可以大体认为反射主要使用在实体操作过程中。而在一般操作数据的过程中,我们的实体一般都是知道并且依赖于对应的数据类型的,比如:

1.根据类型new的方式创建对象

2.根据类型定义变量,类型可能是基本类型也可能是引用类型、类或者接口

3.将对应类型的对象传递给方法

4.根据类型访问对象的属性,调用方法等操作

以上这些操作都是数据操作的过程中最常见也是最难复用优化的地方,而如果这里的操作使用反射则可以实现动态的操作不同的类型的实例,通过调用反射入口类Class,获取对应的属性、构造、方法完成对应的操作

java反射创建方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java反射使用方法、java反射创建方法的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。