请问JAVA反射中,是从什么地方读取类的信息的

请问JAVA反射中,是从什么地方读取类的信息的,第1张

是编译过的calss文件哦,你应该知道java类在运行的时候会被编译成calss文件,而每个java文件上面都有一个package属性,这个东西其实是这个calss文件的路径,你在使用反射的时候需要给Class你的javaclass属性,在运行的时候java虚拟机就会根据你的package属性直接去加载这个class文件

够清楚了吧?采纳!采纳!

java文件是源代码文件,必须要编译成class文件才能被JVM加载。使用ClassforName(类全名)动态加载类到jvm中。class文件必须位于classpath环境变量中的路径下。

举个简单的例子吧,你有一套系统,根据不同版本连接多重不同的数据库,通过反射的方式,你可以通过传递一个字符串的方式来调用某个数据库连接类的方法。如果用set,get方法的话,每新增加一个数据库,就需要新增加一个方法,也就是说需要修改原有的已经写好的类。而使用反射,直接创建一个新的类,然后直接调用就可以了,无需修改任何原有的类。当然这个例子举的很菜鸟,希望你能理解。

Java反射指的是对于任何的一个java类,我们都可以通过反射获取到这个类的所有属性和方法(包含私有的属性方法),使用java反射我们也可以调用一个对象的任何方法。

我们知道Java是一门面向对象编程的语言,我们编程的时候,经常会将类的属性进行封装,然后提供public方法进行属性的设置和获取。类的属性我们通常会设置成private的私有属性,为的就是保护对象属性不被随意的修改和访问。但是反射机制却恰恰相反,通过反射,我们可以获取到这些被保护的属性和方法,并且可以修改和访问他们。

在java中我们可以使用object对象的getClass();方法获得Class的对象classObject;语法格式为 Class classObject = objectgetClass() ;可以根据Class对象的方法获取object对象的相关属性和方法;

获取object对象的名字可以使用 classObjectgetName();获取类的名称,获取到的结果包含包的名称;

获取object对象的包名称,可以使用classObjectgetPackage();获取包的名称;

获取object对象的所有public属性,可以使用classObjectgetFields();方法,返回列表是属性类Field[]对象列表;

获取object对象所有属性,可以使用classObjectgetDeclaredFields();方法,返回的是所有属性列表(包含private属性);

获取object对象某个特定的属性,可以使用classObjectgetField( fieldName );可以根据属性名称获取属性类的对象;

获取object对象private属性,可以使用classObjectgetDeclaredField( fieldName );根据属性名获取属性对象信息;

获取object对象public方法,使用classObjectgetMethods();可以获取到方法类Method[]对象列表;

获取object对象某个特定的public方法,使用classObjectgetMethod( funName , Class parameterTypes);根据方法名和方法参数类型列表,可以获取到方法类的对象;

获取object对象所有方法(包含private方法);使用classObjectgetDeclaredMethods();可以获取所有的方法对象列表;

获取object对象某个特定方法(包含private方法),使用classObjectgetDeclaredMethod ( funName, Class parameterTypes );根据方法名和方法参数类型列表,可以获取到类的特定方法(包含private方法);

获取object对象类中所有的public构造方法,可以使用classObjectgetConstructors(); 获取到构造类Constructor的对象列表;

获取object对象类中某个特定的构造方法,可以使用classObjectgetConstructor( Class parameterTypes ); 根据参数类型列表,获取指定的构造函数对象;

获取object对象类中所有的构造方法(包含private),可以使用classObjectgetDeclaredConstructors(); 获取到构造类Constructor的对象列表;

获取object对象类中某个特定的构造方法(包含private),可以使用classObjectgetDeclaredConstructor( Class parameterTypes ); 根据参数类型列表,获取指定的构造函数对象;

首先大体介绍下反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 举个简单的列子 import javalangreflectConstructor; import javalangreflectField; import javalangreflectMethod; public class ReflectTester { / 通过java的反射机制获取类的所有属性和方法 / public void test1() { try { Class c = ClassforName("demo1clientCustomer"); Systemoutprintln("属性:"); Field f[] = cgetDeclaredFields(); for (int i = 0; i < flength; i++) { Systemoutprintln(f[i]getName()); } Systemoutprintln("方法:"); Method m[] = cgetDeclaredMethods(); for (int i = 0; i < mlength; i++) { Systemoutprintln(m[i]toString()); } } catch (Throwable e) { Systemerrprintln(e); } } / 通过java的反射机制动态修改对象的属性 @param o / public void test2(Customer o) { try { Class c = ogetClass(); //getMethod方法第一个参数指定一个需要调用的方法名称,第二个参数是需要调用方法的参数类型列表,如无参数可以指定null,该方法返回一个方法对象 Method sAge = cgetMethod("setAge", new Class[] { intclass }); Method gAge = cgetMethod("getAge", null); Method sName = cgetMethod("setName", new Class[] { Stringclass }); //动态修改Customer对象的age Object[] args1 = { new Integer(25) }; sAgeinvoke(o, args1); //动态取得Customer对象的age Integer AGE = (Integer) gAgeinvoke(o, null); Systemoutprintln("the Customer age is: " + AGEintValue()); //动态修改Customer对象的name Object[] args2 = { new String("李四") }; sNameinvoke(o, args2); } catch (Throwable e) { Systemerrprintln(e); } } / 通过java的反射机制做一个简单对象的克隆 @param o @return / public Object test3(Customer o) { Object o2 = null; try { Class c = ogetClass(); //通过默认构造方法创建一个新的对象 o2 = cgetConstructor(new Class[] {})newInstance( new Object[] {}); Field fields[] = cgetDeclaredFields(); for (int i = 0; i < fieldslength; i++) { Field field = fields[i]; String fieldName = fieldgetName(); String firstLetter = fieldNamesubstring(0, 1)toUpperCase(); // 获得和属性对应的getXXX()方法的名字 String getMethodName = "get" + firstLetter + fieldNamesubstring(1); // 获得和属性对应的setXXX()方法的名字 String setMethodName = "set" + firstLetter + fieldNamesubstring(1); // 获得和属性对应的getXXX()方法 Method getMethod = cgetMethod(getMethodName, new Class[] {}); // 获得和属性对应的setXXX()方法 Method setMethod = cgetMethod(setMethodName, new Class[] { fieldgetType() }); // 调用原对象的getXXX()方法 Object value = getMethodinvoke(o, new Object[] {}); // 调用拷贝对象的setXXX()方法 setMethodinvoke(o2, new Object[] { value }); } } catch (Throwable e) { Systemerrprintln(e); } return o2; } public static void main(String[] args) throws Exception { ReflectTester t = new ReflectTester(); ttest1(); Customer customer = new Customer(); customersetAge(20); customersetName("张三"); Systemoutprintln("调用前name: " + customergetName()); Systemoutprintln("调用前age: " + customergetAge()); ttest2(customer); Systemoutprintln("调用后name: " + customergetName()); Systemoutprintln("调用后age: " + customergetAge()); Customer customer2 = (Customer)ttest3(customer); Systemoutprintln("克隆对象的name: " + customer2getName()); Systemoutprintln("克隆对象的age: " + customer2getAge()); } } class Customer { private long id; private String name; private int age; public Customer() { } public Customer(String name, int age) { thisname = name; thisage = age; } public long getId() { return id; } public void setId(long id) { thisid = id; } public String getName() { return name; } public void setName(String name) { thisname = name; } public int getAge() { return age; } public void setAge(int age) { thisage = age; } 你可以自己运行下看看,再修改一些看看

以上就是关于请问JAVA反射中,是从什么地方读取类的信息的全部的内容,包括:请问JAVA反射中,是从什么地方读取类的信息的、Java反射机制如何获取到d盘下.Java文件中类的信息,只知道.java的名字以及类名、java:为什么要使用反射技术直接用get,set方法不行吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9699635.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存