导航:首页 > 编程语言 > java类名反射

java类名反射

发布时间:2022-12-27 03:24:59

java 反射有什么用

反射就是把java类中的各种成分映射成为相应的java类。例如:一个java类用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造函数、包等等信息也用一个个java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的java类,表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造函数,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Constructor、Package等等

在平时的编程中,反射基本用不到,但是在编写框架的时候,反射用的就多了,比如你要使用某一个类进行操作,但是这个类是用户通过配置文件配置进来的,你需要先读配置文件,然后拿到这个类的全类名:比如com.onede4..Person,然后在利用反射API来做操作

Ⅱ 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就会创建一个该类的Class对象实例。我们就可以通过这个实例,来访问这个类的信息。

Ⅳ Java反射 在只知道类名的情况下,怎样给其中的私有属性赋值

利用反射能

//假设类名为A
//实例化类
Ap=newA();
//获取class
Classc=p.getClass();
//获取该类所有的字段
Field[]fields=c.getDeclaredFields();
//遍历赋值
for(inti=0;i<fields.length;i++){
StringfiledName=fields[i].getName();
//AccessibleTest类中的成员变量为private,故必须进行此操作
fields[i].setAccessible(true);
//判断类型
Class<?>type=fields[i].getType();
//获取字段类型
StringtypeName=type.getName();
System.out.println(type.getName());

//对字段进行赋值第一个参数为对象引用第二个参数为要附的值

//如果为字符串类型
if("java.lang.String".equals(typeName)){
fields[i].set(p,"1");
}
//如果为日期类型
elseif("java.util.Date".equals(typeName)){
fields[i].set(p,newDate());
}
else{
fields[i].set(p,1);
}

}

//楼主我只是简单的写了下。可能还需要判断字段名称以及其他类型什么的。



最后希望楼主多看看java 文档。

Ⅳ Java的反射到底有什么用途

反射的作用可谓是博大精深,

  1. JDK动态代理生成代理类的字节码后,首先把这个类通过defineclass定义成一个类,然后用class.for(name)会把该类加载到jvm,之后我们就可以通过,A.class.GetMethod()获取其方法,然后通过invoke调用其方法,在调用这个方法时,实际上会通过被代理类的引用再去调用原方法。

  2. Java反射包reflection提供对Class,Method,field,constructor1 等信息的封装类型

  3. 通过这些api可以轻易获得一个类的各种信息并且可以进行实例化,方法调用等。
    类中的private参数可以通过setaccessible方法强制获取。

Ⅵ java中反射实例类装载的步骤及简要阐述

java反射和类装载

反射机制:

Person p=new Person();
这是什么?当然是实例化一个对象了.可是这种实例化对象的方法存在一个问题,那就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制.那么有没有这样一种方式,让我们不知道这个类的类名就可以实例化它的对象呢?Thank Goodness!幸亏我们用的是java, java就提供了这样的机制.

1).java程序在运行时可以获得任何一个类的字节码信息,包括类的修饰符(public,static等),基类(超类,父类),实现的接口,字段和方法等信息.
2).java程序在运行时可以根据字节码信息来创建该类的实例对象,改变对象的字段内容和调用对象方法.
这样的机制就叫反射技术.可以想象光学中的反射,就像我们照镜子,镜子中又出现一个自己(比喻可能不太恰当,但是足以表达清楚意思了).反射技术提供了一种通用的动态连接程序组件的方法,不必要把程序所需要的目标类硬编码到源程序中,从而使得我们可以创建灵活的程序.

反射的实现步骤( 不问不需要答) ,

1、获取类的常用方式有三种: a) Class.forName("包名.类名"),最常用、推荐;b) 包名.类名.class 最简捷;c) 对象.getClass 的方式获得。

2、对象的实例化,上面已经获取了类,只需要调用类的实例化方法,类.newInstance()便可。

3、获取属性和构造等,可以参考 JavaApi 的调用,类. getDeclaredFields,类. getConstructor(..)等。

Java的反射机制是通过反射API来实现的,它允许程序在运行过程中取得任何一个已知名称的类的内部信息.反射API位于java.lang.reflect包中.主要包括以下几类:
1).Constructor类:用来描述一个类的构造方法
2).Field类:用来描述一个类的成员变量
3).Method类:用来描述一个类的方法.
4).Modifer类:用来描述类内各元素的修饰符
5).Array:用来对数组进行操作.
Constructor,Field,Method这三个类都是JVM(虚拟机)在程序运行时创建的,用来表示加载类中相应的成员.这三个类都实现了java.lang.reflect.Member接口,Member接口定义了获取类成员或构造方法等信息的方法.要使用这些反射API,必须先得到要操作的对象或类的Class类的实例.通过调用Class类的newInstance方法(只能调用类的默认构造方法)可以创建类的实例.这样有局限性,我们可以先冲类的Class实例获取类需要的构造方法,然后在利用反射来创建类的一个实例.

类加载机制:



类的加载机制可以分为加载-链接-初始化三个阶段,链接又可以分为验证、准备、解析三个过程。

加载:通过类的加载器查找并加载二进制字节流的过程,在堆内存中的方法区生成 一个代表这个类的 java.lang.Class 对象,作为这个类的数据请求入口。(这里可以把上面类加载器加载文件的过程描述一下(参考版本一,不作重复))。

验证:主要是对一些词法、语法进行规范性校验,避免对 JVM 本身安全造成危害; 比如对文件格式,字节码验证,无数据验证等。但验证阶段是非必须的,可以通过参数 设置来进行关闭,以提高加载的时效。

准备:对类变量分配内存,并且对类变量预初始化,初始化成数据类型的原始值, 比如 static int a=11,会被初始化成成 a=0;如果是 static double a =11,则会被初始化成 a=0.0; 而成员变量只会成实例化后的堆中初始化。

解析:把常量池中的符号引用转换为直接引用的过程。

初始化:对类的静态变量和静态块中的变量进行初始化。(上面的准备阶段可以作为 预初始化,初始到变量类型的原值,但如果被 final 修饰会进行真正初始化)

上面加载、链接、初始化的各个阶段并不是彼此独立,而是交叉进行,这点很重要 。

***class.forName和 classloader的区别

Class.forName 和 ClassLoader 都是用来装载类的,对于类的装载一般为分三个阶段加载、链接、编译,它们装载类的方式是有区别。

首先看一下 Class.forName(..),forName(..)方法有一个重载方法 forName(className,boolean,ClassLoader),它有三个参数,第一个参数是类的包路径,第二个参数是 boolean

类型,为 true 地表示 Loading 时会进行初始化,第三个就是指定一个加载器;当你调用class.forName(..)时,默认调用的是有三个参数的重载方法,第二个参数默认传入 true,第三个参数默认使用的是当前类加载时用的加载器。

ClassLoader.loadClass()也有一个重载方法,从源码中可以看出它默认调的是它的重载 方法 loadClass(name, false),当第二参数为 false 时,说明类加载时不会被链接。这也是两者之间最大区别,前者在加载的时候已经初始化,后者在加载的时候还没有链接。如果你需要在加载时初始化一些东西,就要用 Class.forName 了,比如我们常用的驱动加载, 实际上它的注册动作就是在加载时的一个静态块中完成的。所以它不能被 ClassLoader 加载代替。

Ⅶ 利用java反射机制,通过一个对象获得完整的包名和类名

1、Test t = new Test().Class clazz = t.getClass().System.out.println(clazz.getCanonicalName()).System.out.println(clazz.getSimpleName()).

2、public class TestReflect {public static void main(String[] args) throws Exception {TestReflect testReflect = new TestReflect().System.out.println(testReflect.getClass().getName()).// 结果 net.xsoftlab.ke.TestReflect.}}

3、Java程序

Ⅷ java中反射的三种方法是

第一种:通过forName()方法;

第二种:类.class;

第三种:对象.getClass()。

举例如下:

package
test;

public class Demo{

public static void
main(){

Class<?> c1 = null;

Class<?> c2 =
null;

Class<?> c3 =
null;

//三种反射用实例化方式

try{

//最常用的一种形式

c1 =
Class.forName("test.X");

}catch(ClassNotFoundException
e){

e.printStackTrace();

}

//通过Object类中的方法实例化

c2
= new X().getClass();

//通过类.class实例化

c3 =
X.class;

System.out.println("类名:" + c1.getName());
//得到类名

System.out.println("类名:" + c2.getName());
//得到类名

System.out.println("类名:" + c3.getName());
//得到类名

}

}

Ⅸ 什么是java的反射

Java反射指的是对于任何的一个java类,我们都可以通过反射获取到这个类的所有属性和方法(包含私有的属性方法),使用java反射我们也可以调用一个对象的任何方法。
我们知道Java是一门面向对象编程的语言,我们编程的时候,经常会将类的属性进行封装,然后提供public方法进行属性的设置和获取。类的属性我们通常会设置成private的私有属性,为的就是保护对象属性不被随意的修改和访问。但是反射机制却恰恰相反,通过反射,我们可以获取到这些被保护的属性和方法,并且可以修改和访问他们。
在java中我们可以使用object对象的getClass();方法获得Class的对象classObject;语法格式为 Class classObject = object.getClass() ;可以根据Class对象的方法获取object对象的相关属性和方法;
获取object对象的名字可以使用 classObject.getName();获取类的名称,获取到的结果包含包的名称;
获取object对象的包名称,可以使用classObject.getPackage();获取包的名称;
获取object对象的所有public属性,可以使用classObject.getFields();方法,返回列表是属性类Field[]对象列表;
获取object对象所有属性,可以使用classObject.getDeclaredFields();方法,返回的是所有属性列表(包含private属性);
获取object对象某个特定的属性,可以使用classObject.getField( fieldName );可以根据属性名称获取属性类的对象;
获取object对象private属性,可以使用classObject.getDeclaredField( fieldName );根据属性名获取属性对象信息;
获取object对象public方法,使用classObject.getMethods();可以获取到方法类Method[]对象列表;
获取object对象某个特定的public方法,使用classObject.getMethod( funName , Class... parameterTypes);根据方法名和方法参数类型列表,可以获取到方法类的对象;
获取object对象所有方法(包含private方法);使用classObject.getDeclaredMethods();可以获取所有的方法对象列表;
获取object对象某个特定方法(包含private方法),使用classObject.getDeclaredMethod ( funName, Class... parameterTypes );根据方法名和方法参数类型列表,可以获取到类的特定方法(包含private方法);
获取object对象类中所有的public构造方法,可以使用classObject.getConstructors(); 获取到构造类Constructor的对象列表;
获取object对象类中某个特定的构造方法,可以使用classObject.getConstructor( Class... parameterTypes ); 根据参数类型列表,获取指定的构造函数对象;
获取object对象类中所有的构造方法(包含private),可以使用classObject.getDeclaredConstructors(); 获取到构造类Constructor的对象列表;
获取object对象类中某个特定的构造方法(包含private),可以使用classObject.getDeclaredConstructor( Class... parameterTypes ); 根据参数类型列表,获取指定的构造函数对象;

Ⅹ 实用的Java反射工具类

反射的Utils函数集合

提供访问私有变量 获取泛型类型Class 提取集合中元素的属性等Utils函数

package reflection

import java lang reflect Field import java lang reflect Modifier import java lang reflect ParameterizedType import java lang reflect Type import java util ArrayList import java util Collection import java util List

import mons beanutils PropertyUtils import mons lang StringUtils import slf j Logger import slf j LoggerFactory import springframework util Assert

/** * 反射的Utils函数集合 提供访问私有变量 获取泛型类型Class 提取集合中元素的属性等Utils函数

* * @author lei */ public class ReflectionUtils {

private static Logger logger = LoggerFactory getLogger(ReflectionUtils class)

private ReflectionUtils() { }

/** * 直接读取对象属性值 无视private/protected修饰符 不经过getter函数

*/ public static Object getFieldValue(final Object object final String fieldName) { Field field = getDeclaredField(object fieldName)

if (field == null)

throw new IllegalArgumentException( Could not find field [ + fieldName + ] on target [ + object + ] )

makeAccessible(field)

Object result = null try { result = field get(object) } catch (IllegalAccessException e) { logger error( 不可能抛出的异常{} e getMessage()) } return result }

/** * 直接设置对象属性值 无视private/protected修饰符 不经过setter函数

*/ public static void setFieldValue(final Object object final String fieldName final Object value) { Field field = getDeclaredField(object fieldName)

if (field == null)

throw new IllegalArgumentException( Could not find field [ + fieldName + ] on target [ + object + ] )

makeAccessible(field)

try { field set(object value) } catch (IllegalAccessException e) { logger error( 不可能抛出的异常 {} e getMessage()) } }

/** * 循环向上转型 获取对象的DeclaredField */ protected static Field getDeclaredField(final Object object final String fieldName) { Assert notNull(object object不能为空 ) return getDeclaredField(object getClass() fieldName) }

/** * 循环向上转型 获取类的DeclaredField */ @SuppressWarnings( unchecked )

protected static Field getDeclaredField(final Class clazz final String fieldName) { Assert notNull(clazz clazz不能为空 ) Assert hasText(fieldName fieldName ) for (Class superClass = clazz superClass != Object class superClass = superClass getSuperclass()) { try { return superClass getDeclaredField(fieldName) } catch (NoSuchFieldException e) { // Field不在当前类定义 继续向上转型 } } return null }

/** * 强制转换fileld可访问

*/ protected static void makeAccessible(final Field field) { if (!Modifier isPublic(field getModifiers()) || !Modifier isPublic(field getDeclaringClass() getModifiers())) { field setAccessible(true) } }

/** * 通过反射 获得定义Class时声明的父类的泛型参数的类型 如public UserDao extends HibernateDao<User> * * @param clazz * The class to introspect * @return the first generic declaration or Object class if cannot be * determined */ @SuppressWarnings( unchecked )

public static Class getSuperClassGenricType(final Class clazz) { return getSuperClassGenricType(clazz ) }

/** * 通过反射 获得定义Class时声明的父类的泛型参数的类型 如public UserDao extends * HibernateDao<User Long> * * @param clazz * clazz The class to introspect * @param index * the Index of the generic ddeclaration start from * @return the index generic declaration or Object class if cannot be * determined */

@SuppressWarnings( unchecked )

public static Class getSuperClassGenricType(final Class clazz final int index) {

Type genType = clazz getGenericSuperclass()

if (!(genType instanceof ParameterizedType)) { logger warn(clazz getSimpleName() + s superclass not ParameterizedType ) return Object class }

Type[] params = ((ParameterizedType) genType) getActualTypeArguments()

if (index >= params length || index < ) { logger warn( Index + index + Size of + clazz getSimpleName() + s Parameterized Type + params length) return Object class } if (!(params[index] instanceof Class)) { logger warn(clazz getSimpleName() + not set the actual class on superclass generic parameter ) return Object class } return (Class) params[index] }

/** * 提取集合中的对象的属性 组合成List * * @param collection * 来源集合

* @param propertityName * 要提取的属性名

*/ @SuppressWarnings( unchecked )

public static List fetchElementPropertyToList(final Collection collection final String propertyName) throws Exception {

List list = new ArrayList()

for (Object obj collection) { list add(PropertyUtils getProperty(obj propertyName)) }

return list }

/** * 提取集合中的对象的属性 组合成由分割符分隔的字符串

* * @param collection * 来源集合

* @param propertityName * 要提取的属性名

* @param separator * 分隔符

*/ @SuppressWarnings( unchecked )

lishixin/Article/program/Java/hx/201311/26718

阅读全文

与java类名反射相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:144
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163