㈠ java反射带参构造创建对象时如何自动转换参数类型
importjava.lang.reflect.Constructor;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
publicclassTestReflection
{
publicstaticvoidmain(String[]args)throwsClassNotFoundException,
InstantiationException,IllegalAccessException,IllegalArgumentException,SecurityException,InvocationTargetException,NoSuchMethodException
{
Strings="T";
Class<?>c=Class.forName(s);
Constructor<?>[]consts=c.getConstructors();
//定义有参构造
Constructor<?>consts1=null;
for(inti=0;i<consts.length;i++)
{
intparamsLength=consts[i].getParameterAnnotations().length;
if(paramsLength>0)
{
//判断参数长度取得有参构造
consts1=consts[i];
}
}
//得到有参构造参数类型
Class<?>[]type=consts1.getParameterTypes();
//实验性数据
Object[]values={"A","B","C"};
//得到对象
Objectobj=c.getConstructor(type).newInstance(values);
System.out.println(obj.getClass().getMethod("getA").invoke(obj));
System.out.println(obj.getClass().getMethod("getB").invoke(obj));
System.out.println(obj.getClass().getMethod("getC").invoke(obj));
}
}
classT
{
privateString a;
privateString b;
privateString c;
publicT()
{
System.out.println("T()wasloaded...");
}
publicT(Stringa,Stringb,Stringc)
{
System.out.println("T(String...s)wasloaded...");
this.a=a;
this.b=b;
this.c=c;
}
publicStringgetA()
{
returna;
}
publicvoidsetA(Stringa)
{
this.a=a;
}
publicStringgetB()
{
returnb;
}
publicvoidsetB(Stringb)
{
this.b=b;
}
publicStringgetC()
{
returnc;
}
publicvoidsetC(Stringc)
{
this.c=c;
}
}
㈡ 云南java培训分享JAVA反射机制原理
运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的“反射”机制。
要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由“Class对象”完成的,它包含了与类有关的信息。类是程序的重要组成部分,每个类都有一个Class对象,每当编写并编译了一个新类就会产生一个Class对象,它被保存在一个同名的.class文件中。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)会确认这个类的Class对象是否已经加载,如果尚未加载,JVM就会根据类名查找.class文件,并将其载入,一旦这个类的Class对象被载入内存,它就被用来创建这个类的所有对象。一般的RTTI形式包括三种:
1.传统的类型转换。如“(Apple)Fruit”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException异常。
2.通过Class对象来获取对象的类型。如
Class c = Class.forName(“Apple”);
Object o = c.newInstance();
3.通过关键字instanceof或Class.isInstance()方法来确定对象是否属于某个特定类型的实例,准确的说,应该是instanceof / Class.isInstance()可以用来确定对象是否属于某个特定类及其所有基类的实例,这和equals() / ==不一样,它们用来比较两个对象是否属于同一个类的实例,没有考虑继承关系。
反射
如果不知道某个对象的类型,可以通过RTTI来获取,但前提是这个类型在编译时必须已知,这样才能使用RTTI来识别。即在编译时,编译器必须知道所有通过RTTI来处理的类。
使用反射机制可以不受这个限制,它主要应用于两种情况,第一个是“基于构件的编程”,在这种编程方式中,将使用某种基于快速应用开发(RAD)的应用构建工具来构建项目。这是现在最常见的可视化编程方法,通过代表不同组件的图标拖动到图板上来创建程序,然后设置构件的属性值来配置它们。这种配置要求构件都是可实例化的,并且要暴露其部分信息,使得程序员可以读取和设置构件的值。当处理GUI时间的构件时还必须暴露相关方法的细细,以便RAD环境帮助程序员覆盖这些处理事件的方法。在这里,就要用到反射的机制来检查可用的方法并返回方法名。Java通过JavaBeans提供了基于构件的编程架构。
第二种情况,在运行时获取类的信息的另外一个动机,就是希望能够提供在跨网络的远程平台上创建和运行对象的能力。这被成为远程调用(RMI),它允许一个Java程序将对象分步在多台机器上,云南java培训http://www.kmbdqn.com/认为这种分步能力将帮助开发人员执行一些需要进行大量计算的任务,充分利用计算机资源,提高运行速度。
㈢ 什么是反射什么Java反射
java反射是什么意思呢?下面带大家了解一下。
JAVA反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。反射是一种强大的工具,能够创建灵活的代码,可以使代码在运行时装配,无需在组件之间进行源代表链接。
JAVA反射机制是在运行状态中,知道所有属性和方法,对于任意一个对象,能够调用它的方法和属性,这种动态获取的信息以及动态调用对象的方法的功能的反射机制。
反射适合用在哪
首先我们先思考一个问题,反射适合使用在哪里呢?从功能上看,反射似乎无所不能,几乎所有的类,所有的属性、方法、构造我们都能使用,但是我们细细思考一下,在实际开发中,并不是所有场景都需要使用反射获取属性或者方法进行操作,反而更多的使用实例.xxx方式操作,而当这些操作重复次数较多的时候,我们往往会考虑优化代码,减少代码冗余,提高复用,比如实体构建赋值等操作,这个时候往往是我们最需要复用的地方,所以我们可以大体认为反射主要使用在实体操作过程中。而在一般操作数据的过程中,我们的实体一般都是知道并且依赖于对应的数据类型的,比如:
1.根据类型new的方式创建对象
2.根据类型定义变量,类型可能是基本类型也可能是引用类型、类或者接口
3.将对应类型的对象传递给方法
4.根据类型访问对象的属性,调用方法等操作
以上这些操作都是数据操作的过程中最常见也是最难复用优化的地方,而如果这里的操作使用反射则可以实现动态的操作不同的类型的实例,通过调用反射入口类Class,获取对应的属性、构造、方法完成对应的操作
㈣ java 基本类型 能否通过反射得到
基本数据类型都是可以反射的,你的clazz有个isPrimitive()方法,就是用来表示这个反射的字节码是不是基本类型,没有构造方法只是说明这个基本类型的字节码本来就没有构造方法,
这种基本类型的反射一般可以通过包装类来识别,像 int.class == Integer.TYPE; boolean.class == Boolean.TYPE,另外void 都可以反射呢,void.class == Void.TYPE
㈤ 如何用java的反射实现动态强制类型转换~~
(Cast) 方式本来就是编译时的静态转换,你既然已经在runtime得到TestImpl的具体对象,那就直接使用好了,runtime的时候某个对象是什么类型就已经确定了,不存在类型转换。
㈥ java 反射 数据类型转换
给你一段属性反射的代码,你自己看着改吧
Field[]fs=userCla.getDeclaredFields();
for(inti=0;i<fs.length;i++){
Fieldf=fs[i];
f.setAccessible(true);//设置些属性是可以访问的
Objectval=f.get(bean);//得到此属性的值
System.out.println("name:"+f.getName()+" value="+val);
Stringtype=f.getType().toString();//得到此属性的类型
if(type.endsWith("String")){
System.out.println(f.getType()+" 是String");
f.set(bean,"12");//给属性设值
}elseif(type.endsWith("int")||type.endsWith("Integer")){
System.out.println(f.getType()+" 是int");
f.set(bean,12);//给属性设值
}else{
System.out.println(f.getType()+" ");
}
}
基本就是getType()之后,根据type的类型来反射
㈦ 曲靖电脑培训学校告诉你Java的反射机制
Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程http://www.kmbdqn.cn/就从实际应用的角度出发,来应用一下Java的反射机制。
反射基础
p.s:本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的QuickStart。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
Strings="ziwenxie";
Class<?>c=s.getClass();
通过forName方法
我们也可以调用Class类的静态方法forName:
Class<?>c=Class.forName("java.lang.String");
使用.class
或者我们也可以直接使用.class:
Class<?>c=String.class;
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfo.interfacea包下面新建一个接口A:
packagetypeinfo.interfacea;
publicinterfaceA{voidf();}
接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
㈧ Java反射类型转换错误
升级jdk了吧?
类型更加严格了,仔细检查一下吧。
㈨ java,反射机制
你这个还不是反射,这个叫强制类型转换。 因为己经知道myProxy.getProxy方法返回的类型肯定是 TargetInterface 类型,所以(TargetInterface)myProxy.getProxy肯定没有问题。
同时,TargetInterface 继承自 Object 所以编译也是正确的。
那么真正的反射是利用类的包名直接实例化出类的对象实例,以下是类反射的一个例子:
Class<?> cls= Class.forName(“com.app.TargetInterface”);
if(cls!=null){
try {
TargetInterface interface=(TargetInterface)cls.newInstance();
} catch (Exception e) {}
}
这样,只要传给一个字符串,就可以把一个类构建出对象来。
本例中构建出来的是采用该类的默认构造函数, 还可以指定构造器。
甚至利用类反射可以分析出类结构中所有的方法和属性。
利用类反射机制可以制造计算机病毒。
具体更多的类反射知识可以详见专门介绍此知识的书籍
㈩ java课程分享Java的反射机制
Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java课程http://www.kmbdqn.com/就从实际应用的角度出发,来应用一下Java的反射机制。
反射基础
p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start。
在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个getClass方法,通过getClass方法我们可以获取到这个对象对应的反射类:
String s = "ziwenxie";
Class<?> c = s.getClass();
通过forName方法
我们也可以调用Class类的静态方法forName:
Class<?> c = Class.forName("java.lang.String");
使用.class
或者我们也可以直接使用.class:
Class<?> c = String.class;
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。
首先我们在typeinfo.interfacea包下面新建一个接口A:
package typeinfo.interfacea;
public interface A { void f(); }
接着我们在typeinfo.packageaccess包下面新建一个接口C,接口C继承自接口A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。