㈠ 说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题
反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分。
1.获得方法包括获得方法的名称,方法的返回类型,方法的访问修饰符,以及通过反射执行这个方法。
2.获得属性包括属性的名称,类型,访问修饰符,以及这个属性的值。
这些获得都有相应的API提供操作。
举个例子:
先定义一个类,有age这个属性,以及age的get和set方法:
public class TestRflectionFather {
public int age =32;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然后操作获得所有方法:
import java.lang.reflect.Method;
public class Testmain {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("TestRflectionFather");
Method[] methods =clazz.getDeclaredMethods();
for(Method me:methods)
{
System.out.println(me.getName());
}
}
}
//最后输出
getAge
setAge
㈡ java反射调用属性的set方法时,若属性为int类型,会出错,设置通过get得到的值的getClass为Integer。
Integer可以直接转成int的啊,int是基本类型,去不是继承于object,而integer是类才能用getclass方法。获得之后能够转成int型
㈢ Java如何获得一个对象中所有带set方法的字段(形成Field对象)包括父类的。有现成的工具类
在Java中 是获取不了对象里面的字段的(除非是一些固定写死的字段) ,但是可以利用反射获取set方法,进行赋值
具体可以参考一下代码
/**
*
* @param obj 赋值对象
* @param value 赋值的值
* @throws Exception
*/
public void setMethod(Object obj ,String value) throws Exception{
if (obj == null ) {
return;
}
Method[] methods = obj.getClass().getMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
String name = method.getName();
if(name.contains("set")){
method.invoke(obj,value);
}
}
}
㈣ java中的反射,invoke方法详解
就是调用类中的方法,最简单的用法是可以把方法参数化,invoke(class, method)比如你Test类里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue
如:publicclass MyTest{publicstaticvoidmain(String[]args) {String[]names={"tom","tim","allen","alice"};
Class<?>clazz=Test.class;try Methodmethod=clazz.getMethod("sayHi",String.class);for(Stringname:names)method.invoke(clazz.newInstance(),name);}catch(NoSuchMethodExceptione)e.printStackTrace();}catch(IllegalAccessExceptie.printStackTrace(}catch(IllegalArgumentException{e.printStackTrace();}catch(InvocationTargetExceptione)e.printStackTrace();}catch(InstantiationExceptione{e.printStackTrace(}classTest{publicvoidsayHi(Stringname){System.out.println("Hi"+name);}
㈤ JAVA从数据库查出来的数据放到实体类想用反射的方法给他们赋值,怎么做
说一个大概思路吧:
1.读取数据:从数据库中读取数据的同时,拿到元数据,即metadata;
2.实例化:通过类名,利用反射 实例你的实体类(类名可以和表名保持一致,这样就不用写额外的
映射了),如果你只是想通过反射赋值的话,你也可以直接new个类;
3.方法调用:通过元数据,利用反射 得到你的set方法(方法名可以和字段名保持一致,否则你要写
出映射关系);
㈥ java中, 怎么调用别的类的私有方法
利用反射即可调用;
简易实例代码如下:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author thomaslwq
* @version 创建时间:Sep 4, 2012 9:53:49 PM
* 类说明
*/
public class ReflectionTest {
public static void setObjectColor(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAcces***ception, InvocationTargetException{
Class cls = obj.getClass();
//获得类的私有方法
Method method = cls.getDeclaredMethod("privateMethod", null);
method.setAccessible(true); //没有设置就会报错
//调用该方法
method.invoke(obj, null);
}
public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAcces***ception, InvocationTargetException{
setObjectColor(new MyTest());
}
}
//测试类
class MyTest{
public void setMyTest(){
System.out.println("setMyTest");
}
/**
类的私有方法
**/
private void privateMethod(){
System.out.println("调用了 private Method");
}
}
㈦ java反射机制可以调用到私有方法,是不是就破坏了JAVA的卦装性呢。
这是一个很值得探讨的问题,许多人接触反射时,对反射功能之强大都会抱有怀疑,感觉严重破坏了封装的性质。可是,什么是封装,什么是安全呢?
封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。
所谓安全,如果意思是保护实现源码不被别人看见,那没有作用。不用反射也能轻易获取源码。
所以我以为反射机制只是提供了一种强大的功能,使得开发者能在封装之外,按照特定的需要实现一些功能。就好比核技术,虽然造核弹很危险吧,但造核电站还是很有用处的(这个比喻似乎不是很恰当,将就将就)。
曾经给朋友讨论过这个问题,感觉解释得不是很清楚,大家一起探讨探讨,看看怎样表述才能更容易理解:)
㈧ 调用一个javabean实例的属性都有哪些方式
JavaBean 是一种普遍应用的 Java 类型,它定义了一个标准的Java类来承载和封装数据。可以调用 JavaBean 实例的属性有以下几种方式:
使用公共的 getter 和 setter 方法:实现一个包含 get/set 方法和无参构造函数的JavaBean类,在程序中使用 getter 和 setter 方法分别获取和设置JavaBean实例的单个属性。
通过反射 API 调用属性: 可以使用 Java 的反射机制获取和设置对象实例的内部属性,通过反射也能够修改 private类型的属性。
直接访问公共的属性变量:如果 JavaBean 中的属性使用 public 特性标识, 则可以像普通变量那样直接访问 JavaBean 实例的属性。
JSON 数据绑定:JavaBean可以使用JSON序列化/反序列化技术将JavaBean类映射到 JSON 对象中,从而获取或操作JavaBean实例的属性。
下面是一些示例代码片段,展示如何使用这些不同方式访问JavaBean实例的属性:
通过 getter 和 setter 方法:
通过反射 API 调用 JavaBean 的属性:
直接访问公共的属性变量:
使用 JSON 数据绑定:
总之,以上这些方式并不是完整的JavaBean实例属性的访问方式,需要根据具体场景和实际要求进行选择。