通过反射,如何获得子类继承自父类的属性
发布时间:2025-05-12 14:30:32 发布人:远客网络
一、通过反射,如何获得子类继承自父类的属性
你是想通过反射获得该类所有属性值或是给所有属性赋值吧。用getMethods获取所有的getter和setter方法,再取值或赋值。但不要用getDeclaredMethods,因为getMethods反映此 Class对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member方法;而getDeclaredMethods反映此 Class对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。这也许是框架注入属性值都采用setter注入的原因吧。
二、一文读懂java中的反射,边学边实战!
1、Java中的反射机制是在运行时动态获取类信息和对象方法的能力,以下是关于Java反射的简洁解读及实战要点:
2、一、反射的基本概念定义:反射机制允许程序在运行时动态地获取类的内部信息,并能直接操作类的字段和方法。作用:是框架设计的核心要素,在模块化开发、动态代理设计模式以及Spring、Hibernate等框架中扮演着关键角色。
3、二、获取Class实例方式:通过类的静态变量:ClassName.class。使用Class.forName:Class.forName,需要处理ClassNotFoundException。实例的getClass:对象实例.getClass。通过ClassLoader.loadClass:ClassLoader.getSystemClassLoader.loadClass,需要处理ClassNotFoundException。
4、三、反射的核心操作获取类的信息:字段:通过Class实例的getDeclaredFields或getFields方法获取字段信息。方法:通过Class实例的getDeclaredMethods或getMethods方法获取方法信息。访问和修改字段:使用Field对象的get和set方法访问和修改字段值。对于非public字段,需要先调用setAccessible解除访问限制。调用方法:使用Method对象的invoke方法调用类的方法。反射调用遵循多态原则。创建实例:使用Constructor对象的newInstance方法创建类的实例,可以调用任何形式的构造函数。
5、四、反射的高级应用查询继承关系:使用Class实例的getSuperclass方法获取父类信息。使用Class实例的getInterfaces方法获取实现的接口信息。类型判断:使用isAssignableFrom方法判断一个类型是否可以被另一个类型安全地向上转型。
6、五、实战注意事项性能开销:反射操作相比直接代码调用有一定的性能开销,应尽量避免在性能敏感的场景中使用。安全性:反射操作可能破坏封装性,需要谨慎处理非public字段和方法的访问。同时,某些安全策略可能限制反射操作。异常处理:反射操作中可能抛出多种异常,如ClassNotFoundException、NoSuchMethodException、IllegalAccessException等,需要进行适当的异常处理。
7、六、实战示例创建一个类,包含私有字段和私有方法。使用反射机制获取该类的字段和方法信息。通过反射机制访问和修改私有字段的值。通过反射机制调用私有方法。使用反射机制创建该类的实例。
8、通过上述内容,可以快速了解Java中的反射机制,并通过实战练习加深理解。
三、求java考题,笔试题
This():当前类的对象,super父类对象。
Super():在子类访问父类的成员和行为,必须受类继承规则的约束
而this他代表当前对象,当然所有的资源都可以访问.
在构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个函数被私有化了(用private修饰).此时你必须加入对父类的实例化构造.而this就没有这个要求,因为它本身就进行实例化的构造.
而在方法中super和this使用的方法就差不多了.只不过super要考虑是否能访问其父类的资源.
2.作用域public,protected,private,以及不写时的区别?
Public:不同包、同一包、类内都可用
Protected:不同包的子类、同一包、类内都可用
publicstatic void main(String[] args){
4. JAVA的事件委托机制和垃圾回收机制
Java事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。
垃圾回收机制垃圾收集是将分配给对象但不再使用的内存回收或释放的过程。如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收
5.在JAVA中,如何跳出当前的多重嵌套循环?
6.什么是java序列化,如何实现java序列化?(写一个实例)
序列化:处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implementsSerializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
7.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。如果这个类的修饰符是public,其类名与文件名必须相同。
8.排序都有哪几种方法?请列举。用JAVA实现一个快速排序?
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
9. Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
重写Override,子类覆盖父类的方法,将子类传与父类的引用调用的还是子类的方法。
重载Overloading一个类多个方法,名称相同,参数个数类型不同。
两者都是Java多态性的不同表现。
Overloaded的方法是可以改变返回值的类型。
System.out.prinln(8+8+”88”+8+8);
(方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型。)
属性常量方法不可以overridding类不可以继承
11.继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
System.out.println("FatherClassCreate");
public class ChildClass extends FatherClass{
System.out.println("ChildClassCreate");
public static void main(String[] args){
FatherClass fc= new FatherClass();
ChildClass cc= new ChildClass();
System.out.println("InterClassCreate");
InterClass ic= new InterClass();
System.out.println("OuterClassCreate");
public static void main(String[] args){
OuterClass oc= new OuterClass();
C:>java test/OuterClass InterClass Create OuterClass Create
13.用JAVA实现一种排序,JAVA类实现序列化的方法(二种)?
14.如在COLLECTION框架中,实现比较要实现什么样的接口?
public InsertSort(int num,int mod){
System.out.println("The ArrayList SortBefore:");
al.add(new Integer(Math.abs(rand.nextInt())% mod+ 1));
System.out.println("al["+i+"]="+al.get(i));
for(int i=1;i<al.size();i++){
tempInt=(Integer)al.remove(i);
if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue()){
System.out.println(al.toString());
for(int j=0;j<MaxSize;j++){
if(((Integer)al.get(j)).intValue()>=tempInt.intValue()){
System.out.println(al.toString());
System.out.println("The ArrayList SortAfter:");
for(int i=0;i<al.size();i++){
System.out.println("al["+i+"]="+al.get(i));
public static void main(String[] args){
InsertSort is= new InsertSort(10,100);
JAVA类实现序例化的方法是实现java.io.Serializable接口
Collection框架中实现比较要实现Comparable接口和 Comparator接口
16.编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。
public static void split(String source,intnum) throws Exception{
for(int i= 0; i<source.length(); i++){
byte[]b=(source.charAt(i)+"").getBytes();
15、Java编程,打印昨天的当前时刻
public class YesterdayCurrent{
public void main(String[] args){
Calendar cal= Calendar.getInstance();
System.out.println(cal.getTime());
BufferedReader in= new BufferedReader(newFileReader(f));
while((stri=in.readLine())!=null){
i= Integer.parseInt(stri.trim());
PrintWriter out=new PrintWriter(newBufferedWriter(new FileWriter(f,false)));
out.write(String.valueOf(i));//可能是编码的原因,如果直接写入int的话,将出现java编码和windows编码的混乱,因此此处写入的是String
public static void main(String[] ars){
A ab= new B();//执行到此处,结果: 1a2b
ab= new B();//执行到此处,结果: 1a2b2b
}注:类的static代码段,可以看作是类首次加载(被虚拟机加载)执行的代码,而对于类的加载,首先要执行其基类的构造,再执行其本身的构造
(1)接口可以被多重implements,抽象类只能被单一extends(2)接口只有定义,抽象类可以有定义和实现(3)接口的字段定义默认为:publicstatic final,抽象类字段默认是"friendly"(本包可见)
当功能需要累积时用抽象类,不需要累积时用接口。
通过类(Class对象),可以得出当前类的fields、method、construtor、interface、superClass、modified等,同是可以通过类实例化一个实例、设置属性、唤醒方法。Spring中一切都是返射、struts、hibernate都是通过类的返射进行开发的。
20、类的返射机制中的包及核心类?
①java.lang.Class②java.lang.refrection.Method③java.lang.refrection.Field
④java.lang.refrection.Constructor⑤java.lang.refrection.Modifier⑥java.lang.refrection.Interface
21、得到Class的三个过程是什么?
①对象.getClass()②类.class或Integer.type(int) Integer.class(java.lang.Integer)③Class.forName();
①产生一个Class数组,说明方法的参数②通过Class对象及方法参数得到Method③通过method.invoke(实例,参数值数组)唤醒方法
23、如何将数值型字符转换为数字(Integer,Double)?
Integer.parseInt(“1234”) Double.parseDouble(“123.2”)
25、如何去小数点前两位,并四舍五入。
double d=1256.22d; d=d/100; System.out.println(Math.round(d)*100);
26、如何取得年月日,小时分秒?
Calendar c=Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH,31);
System.out.println(c.get(Calendar.YEAR)+""+(c.get(Calendar.MONTH)+1)+""+c.get(Calendar.DAY_OF_MONTH));
27、如何取得从1970年到现在的毫秒数
Java.util.Date dat=new Date(); long now=dat.getTime();
28、如何获取某个日期是当月的最后一天?
当前日期加一天,若当前日期与结果的月份不相同,就是最后一天。
取下一个月的第一天,下一个月的第一天-1
public static void main(String[] args){
Calendarc=Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH,30);
Calendarc1=(Calendar)c.clone();
System.out.println(c.get(Calendar.YEAR)+""+(c.get(Calendar.MONTH)+1)+""+c.get(Calendar.DAY_OF_MONTH));
c.add(Calendar.DAY_OF_MONTH,1);
if(c.get(Calendar.MONTH)!=c1.get(Calendar.MONTH)){
System.out.println("是最后一天");
System.out.println("不是取后一天");
Import java.text. SimpleDateFormat;
SimpleDateFormat sdf=newSimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str=sdf.format(dat);//把日期转化为字符串
Java.util.Date d1=sdf.parse(“yyyy-mm-dd”);//将字符串转化为日期
30、编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。
String a=new String("中".getBytes("gb2312"),"iso-8859-1");
String a=new String("中".getBytes("iso-8859-1"));
应该是String a=new String("中".getBytes("gb2312"),"iso-8859-1");
String a1=newString(a.getBytes("iso-8859-1"));