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

java反射类变量

发布时间:2025-01-28 13:52:24

java 中怎么获得以该字符串命名的变量

实现以上场景,在java中有多种方法,最直接方式的是通过反射获取,但是反射有较大的性能损耗,一般不建议用在运行阶段反射,大多开源框架是在初始化的时候通过反射来实例化。

1、通过扮渣尘反射获取

packagetest;

importjava.lang.reflect.Field;

publicclassDemo2{
publicstaticvoidmain(String[]args),IllegalAccessException,NoSuchFieldException,SecurityException{
Stringop="strA";
Testt=newTest();

///通过类的字节码得到该类中声明的所有属性,无论私有或公有
Fieldstrs=Test.class.getDeclaredField(op);
//设置访问权限(这点对于有过android开发经验的可以说很熟悉)
strs.setAccessible(true);
厅禅//得到私有的变量值
String[]as=(String[])strs.get(t);


System.out.println(as.length);

}


}

classTest{
privateString[]strA=newString[]{"a","b","c"};
privateString[]strB梁槐=newString[]{"d","e","f"};
}


2、通过map设置获取

packagetest;

importjava.util.HashMap;
importjava.util.Map;

publicclassDemo2{
publicstaticvoidmain(String[]args),IllegalAccessException,NoSuchFieldException,SecurityException{

Map<String,String[]>map=newHashMap<String,String[]>();
map.put("strA",newString[]{"a","str","c"});
map.put("strB",newString[]{"d","e","f"});
Stringop="strB";

Stringresult=map.get(op)[0];//"d"

}
}

以上两种方法虽然都能实现需求,但是在实际情况中还是得看具体的情况来界定选择。

❷ 为什么使用java反射

Java反射最大的好处就是能在运行期间,获得某个类的结构、成员变量,用来实例化。
下列是具体使用场景:假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。大家都用过Jcreator和eclipse。当我们构建出一个对象的时候,去调用该对象的方法和属性的时候。一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。

❸ JAVA中反射是什么

JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。

Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。

(3)java反射类变量扩展阅读:

JAVA中反射实例:

1、Class superClass=clazz.getSuperclass();//获取父类。

System.out.println("getSuperclass:"+superClass)。

2、Class[] interfaces=clazz.getInterfaces();//获取实现接口。

System.out.println("getInterfaces:"+interfaces.length)。

3、Constructor[] cons=clazz.getConstructors();//构造方法。

System.out.println("getConstructors:"+cons.length)。

参考资料来源:网络: JAVA反射机制

❹ java如何利用反射机制得到一个类中为数组类型的成员变量的值

写了个例子,请仔细查看代码,具体过程需要你自己对照java API 再研究,


先定义了一个普通的学生类,如下:

publicclassStudent{
privateintid;
privateStringname;
privateintage;
privateString[]aiHao;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicString[]getAiHao(){
returnaiHao;
}
publicvoidsetAiHao(String[]aiHao){
this.aiHao=aiHao;
}
}

对学生类进行反射

publicclassTest3{
publicstaticvoidmain(String[]args){
Students=newStudent();
s.setId(1);
s.setName("张三");
s.setAge(23);
s.setAiHao(newString[]{"足球","篮球","上网"});
try{
//获取所有的变量
Field[]fields=Student.class.getDeclaredFields();
//循环处理变量
for(Fieldf:fields){
f.setAccessible(true);
Objectvalue=f.get(s);//取变量的值
System.out.print("变量名称为:"+f.getName());
if(value.getClass().isArray()){//判断是否是数组
Object[]arr=(Object[])value;//装换成数组
System.out.println(",变量值等于:"+Arrays.toString(arr));
//这里还可以做额外处理,判断数组的类型如下面注释的代码
/*
for(Objecta:arr){
System.out.println("参数类型"+a.getClass().getName());
//同样运用反射的机制做额外处理
}
*/
}else{
//非数组类型,普通处理
System.out.println(",变量值等于:"+value);
}
f.setAccessible(false);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}

❺ 能说一下java的反射机制吗

反射:一个类有多个组成部分,例如:成员变量、方法、构造方法等

反射就是加载类,并解剖出类的各个组成部分


java中有一个Class类用于代表某一个类的字节码。Class类提供加载某个字节码的方法:forName()

forName方法用于加载某个类的字节码到内存中,并使用Class对象进行封装


另外两种得到Class对象的方式:

  1. 类名.class

  2. 对象。getClass()


SUN公司为简化创建对象的方法,它在Class对象中也提供了一个newInstance方法,用于创建类的对象,这样开发人员可以避免每次都需要去反射Constructor类以创建对象

不过需要注意的是,Class.newInstance方法内部是反射类无参的构造函数创建的对象,所以利用此种方式创建类对象时,类必须有一个无参的构造函数


总结如下:反射机制是开发框架时才运用到的技术

❻ Java通过反射可以设置私有变量的好处有哪

Java通过反射可以设置私有变量的好处有
public class PrivateTest { private String name = "hello"; public String getName() { return name; } } public class ReflectionTest { public static void main(String[] args) throws Exception { PrivateTest pt = new PrivateTest(); Class clazz = PrivateTest.class; Field field = clazz.getDeclaredField("name"); field.setAccessible(true); field.set(pt, "world"); field.setAccessible(false); System.out.println(pt.getName()); } } 这样通过反射可以设置私有变量,Java当时设计的时候是出于什么考虑的呢?
但是也有应用的场景,可以想到的是: hibernate中你定义实体类及相应的字段(和数据库表对应),你可以在映射文件中配置: 当你从数据库中获取到数据后,是调用类的setxxx()方法,还是直接给字段赋值,这里字段是可以设置成private的,用的就是反射。那java反射可以设置私有变量的值,是好处多还是坏处多呢? 问题补充:robertliudeqiang 写道提供了一种接口吧,一般情况下不会用的。
但是也有应用的场景,可以想到的是: hibernate中你定义实体类及相应的字段(和数据库表对应),你可以在映射文件中配置: 当你从数据库中获取到数据后,是调用类的setxxx()方法,还是直接给字段赋值,这里字段是可以设置成private的,用的就是反射。目前反射设置private变量的值,还未看出是有好处 的。
那应该是java的一个问题遗留,为了兼容没法解决的。

阅读全文

与java反射类变量相关的资料

热点内容
正则命令 浏览:341
javawin10配置环境变量 浏览:564
梁全长箍筋加密怎么设置 浏览:403
苹果appstore怎么填 浏览:688
radiogroupandroid 浏览:152
微信加密手机店能破解吗 浏览:952
如何更换win7补丁服务器地址 浏览:702
如何举报dota2服务器 浏览:584
苹果怎么打链接微信文件夹 浏览:366
阿拉德之路怎么苹果跟安卓一起玩 浏览:241
主力排序选股源码 浏览:149
android无法生成apk文件 浏览:505
如何开一个挂网页的服务器 浏览:538
虞城车辆解压去哪里 浏览:759
如何发送战舰世界命令 浏览:609
二次解压软件是什么意思 浏览:208
公司内网DNS服务器如何输入 浏览:966
服务器f1如何改中文语言 浏览:323
编写文件夹程序 浏览:261
华为防火墙查看mtu的命令 浏览:928