Ⅰ 大神解释一下java反射有什么作用
反射的作用可谓是博大精深,JDK动态代理生成代理类的字节码后,首先把这个类通过defineclass定义专成一个类,属然后用class.for(name)会把该类加载到jvm,之后我们就可以通过,A.class.GetMethod()获取其方法,然后通过invoke调用其方法,在调用这个方法时,实际上会通过被代理类的引用再去调用原方法。
Java反射包reflection提供对Class,Method,field,constructor1 等信息的封装类型
通过这些api可以轻易获得一个类的各种信息并且可以进行实例化,方法调用等。
类中的private参数可以通过setaccessible方法强制获取。
Ⅱ 如何通过java 反射 调用一个 含有 可变参数的 方法呢
java反射调用可变参数的方法的方式是传入objects参数,如下代码:
publicclassReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Single.class;
Singlesingle=(Single)clazz.newInstance();
List<String>list=newArrayList<String>(){
=1L;
{
add("fuck");
add("ni");
add("mei");
}
};
//获取method两种方式,在method中数组的的空间大小是可以随便写的不一定使用0
/*1*/
Methodmethod=clazz.getDeclaredMethod("method",Array.newInstance(Object.class,0).getClass());
/*2*/
method=clazz.getDeclaredMethod("method",(newObject[0]).getClass());//初始化参数
/*1*/
Objectobjs=Array.newInstance(Object.class,2);
Array.set(objs,0,list);
Array.set(objs,1,"23");
method.invoke(single,objs);
/*2*/
Object[]objects={1,"fuck",list};
method.invoke(single,newObject[]{objects});
}
}
classSingle{
publicvoidmethod(Object...objs){
System.out.println(Arrays.deepToString(objs));
}
}
结果:
[[fuck,ni,mei],23]
[1,fuck,[fuck,ni,mei]]
Ⅲ java用反射来执行类方法会产生对象吗如果产生对象,多线程下对同一个类进行反射调用会不会产生多个对象
/**
*其实反射机制调用方法的过程:
*1类字节码注册。
*2创建对象(newnewInstance())。
*3反射机制调用方法。
*所以反射机制和普通的创建对象的方法(new方式)是一样的。
*多线程下利用反射机制创建对象调用方法和多线程普通方式创建对象并调用方法是一样。
*只不过反射的好处是框架化,参数化
*下面是利用反射创建ArrayList,并调用ArrayList的add()。
*/
publicstaticvoidmain(String[]args)throwsException{
//反射机制注册ArrayList
Classclazz=Class.forName("java.util.ArrayList");
//反射创建对象(无参)
List<String>list=(List<String>)clazz.newInstance();
//反射获取方法
Methodmethod=clazz.getMethod("add",Object.class);
//反射调用方法
method.invoke(list,"remind");
//测试
for(Stringval:list){
System.out.println(val);
}
}
Ⅳ java反射中的newInstance的使用
其实类就是一个对象么。object就是对象的意思。
object就是泛指所有的类,而我们常用的 A a = new A();这种写法就是具体化了。其实也可以写成Object ojb = new A();
newIntance()就是对象的实例化,返回的一个对象,如果知道具体对象的时很么的话,也可以直接用该对象来接受 A a = c.newInstance()
Ⅳ 能说一下java的反射机制吗
反射:一个类有多个组成部分,例如:成员变量、方法、构造方法等
反射就是加载类,并解剖出类的各个组成部分
java中有一个Class类用于代表某一个类的字节码。Class类提供加载某个字节码的方法:forName()
forName方法用于加载某个类的字节码到内存中,并使用Class对象进行封装
另外两种得到Class对象的方式:
类名.class
对象。getClass()
SUN公司为简化创建对象的方法,它在Class对象中也提供了一个newInstance方法,用于创建类的对象,这样开发人员可以避免每次都需要去反射Constructor类以创建对象
不过需要注意的是,Class.newInstance方法内部是反射类无参的构造函数创建的对象,所以利用此种方式创建类对象时,类必须有一个无参的构造函数
总结如下:反射机制是开发框架时才运用到的技术
Ⅵ java中用反射, newInstance一个自定义类的时候总是java.lang.NullPointerException,很迷惑
你的数组元素没有初始化。在byTwo[i].aaa =i;前面加上byTwo[i]=new My();并且用大括号括起来,
在byOne[i].aaa =i;前面加上byOne[i]=new My();并且用大括号括起来,就行了。
完整的程序如下:
package myInstance;
import java.lang.reflect.Array;
public class ArrayUtils {
public static <T> T[] newArrayByArrayClass(Class<T[]> clazz, int length) {
return (T[]) Array.newInstance(clazz.getComponentType(), length);
}
public static <T> T[] newArrayByClass(Class<T> clazz, int length) {
return (T[]) Array.newInstance(clazz, length);
}
public static void main(String[] args) {
My[] byTwo = null;
byTwo = newArrayByClass(My.class, 10);//第一种方法
for(int i = 0;i < 10; i ++){
byTwo[i]=new My();
byTwo[i].aaa =i;
}
My[] byOne =null;
byOne = newArrayByArrayClass(My[].class, 10);//第二种方法
for(int i = 0;i < 10; i ++){
byOne[i]=new My();
byOne[i].aaa =i;
}
}
}
//定义“My”类
package myInstance;
public class My
{
public int aaa;
public My(){}
}
Ⅶ java反射机制详解
在Java运行时刻,能否知道一个类的属性方法并调用改动之?对于任意一个对象,能否知道他的所属类,并调用他的方法?答案是肯定的。这种动态的获取信息及动态调用方法的机制在Java中称为“反射”(reflection)。
Java反射机制主要提供以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法。
Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods 的所有信息,并可于运行时改变fields内容或调用methods。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类;
Field 类:代表类的成员变量(成员变量也称为类的属性);
Method类:代表类的方法;
Constructor 类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组的元素的静态方法;
至于全部的你可以看看参考资料。我看这个资料不错
Ⅷ java反射,调用private的方法
soeasy
Stringpath=“com.test.B”
Classclazz=Class.forName(path);//获得b的反射
Bb=(B)clazz.newInstance();//前提是b类有个无参构造函数
Methodm=clazz.getDeclaredMehod("SetName",String.class);
m.setAccessible(true);//不做安全检查,你才可以去访问专私有方法
m.invoke(b,"哈哈");
这里是给属B里面的(下面这个方法进行调用赋值)
privatevoidSetName(Strings){}
psgetDeclaredMehod是对私有的方法进行调用要访问必须加setAccessible
getMehod是对通用方法进行调用,不用加setAccessible