反射内省作业 您所在的位置:网站首页 内省的含义 反射内省作业

反射内省作业

2023-08-13 11:15| 来源: 网络整理| 查看: 265

目录

1、单选题

2、编程题

反射基本方法的使用

使用反射输出学生name和age

演示内省

1、单选题

1、下面程序的输出结果是什么? (C)

public class Example extends Date {

 public static void main(String[] args) {

  new Example().test();

 }

 public void test() {

  System.out.println(super.getClass().getName());

 }

}

A. Date   B. Object   C. Example   D. 运行时抛出异常

2、假定Tester 类有如下test方法:

public int test(int p1, Integer p2)

以下哪段代码能正确地动态调用一个Tester 对象的test方法?(C)

A. Class classType=Tester.class;

Object tester=classType.newInstance();

Method addMethod=classType.getMethod("test",new Class[]{int.class,int.class});

Object result=addMethod.invoke(tester,

new Object[]{new Integer(100),new Integer(200)});

B. Class classType=Tester.class;

Object tester=classType.newInstance();

Method addMethod=classType.getMethod("test",new Class[]{int.class,int.class});

int result=addMethod.invoke(tester,

new Object[]{new Integer(100),new Integer(200)});

C. Class classType=Tester.class;

Object tester=classType.newInstance();

Method addMethod=classType.getMethod("test",new Class[]{int.class,Integer.class});

Object result=addMethod.invoke(tester,

new Object[]{new Integer(100),new Integer(200)});

D. Class classType=Tester.class;

Object tester=classType.newInstance();

Method addMethod=classType.getMethod("test",new Class[]{int.class,Integer.class});

Integer result=addMethod.invoke(tester,

new Object[]{new Integer(100),new Integer(200)});

3、下列关于Java代码描述中正确的是(B)

A. 反射与内省并没有太大的关系

B. 反射是一个确定有哪些成员变量、成员方法可在一个对象上使用的过程    

C. 内省(Introspector)是Java语言对JavaEE类属性、事件的处理方法

D. 内省对于任意一个对象,都能够调用它的任意一个方法

4、下列关于内省与反射描述错误的是(B)

A. 内省是一种特殊的反射

B. 反射技术操作javabean更简单,方便

C. 内省是基于反射的,只是在反射的基础之上封装了

D. 动态获取类信息以及动态调用类对象方法的功能叫做Java语言的反射机制。

5、java中内省与反射描述正确的是(D)

A.内省比反射机制更简单,更强大

B. 反射就是把java类中的各种成分映射成一个个的class代码类

C. 内省比反射的作用范围更广

D. 反射就是通过把指定的类中各种元素成分都映射成相关的反射包中的相应类

6、Java反射的功能? (C)

A. 通过反射不可以判断对象所在的类。

B. 通过反射不能判断运行时对象所具有的成员变量和方法。

C.通过反射可以调用到private的方法

D. 通过反射不可以生成动态代理

7、内省的作用是:(A)

A.内省基于反射实现B.主要用于操作接口C.通过内省不可以获取bean的getter/setter

8、Java反射的类一般在哪个包里(B)

A. java.util.List 

B. java.lang.relfect  

 C.  java.nio.channels  

 D. java.util.concurrent

9、关于类的加载时机说法错误的是(A )

A、Java程序启动时加载所有的类到内存中

B、某个类的对象被创建时加载一个类

C、用类名调用该类的静态方法时加载一个类

D、初始化一个类的子类时加载一个类

10. 关于反射机制下列说法错误的是(B )  

A、反射机制指的是在程序运行过程中,通过.class文件加载并使用一个类的过程

B、反射机制指的是在程序编译期间,通过.class文件加载并使用一个类的过程

C、反射可以获取类中所有的属性和方法

D、暴力反射可以获取类中私有的属性和方法

11. 使用反射机制获取一个类的属性,下列关于getField()方法说法正确的是(A )

A、该方法需要一个String类型的参数来指定要获取的属性名

B、该方法只能获取私有属性

C、该方法只能获取公有属性

D、该方法可以获取私有属性,但使用前必须先调用setAccessible(true)

12.有关于反射说法错误的是(D)

A.使用Class.forName("com.yy.xxx")方法获取类

B.class.newInstance()实例化一个对象

C.class.getDeclaredMethods()获取方法列表

D.method.invoke(obj, args)不能执行私有方法

2、编程题 反射基本方法的使用

1、建立一个类Test, 包含一个私有的成员字符串变量s, 一个公共无參构造方法,

一个公共的无參方法method1, 一个公共的有參的方法method2(int n),  一个私有的无參方法method3()。 然后通过反射机制, 建立一个Test对象, 并调用这个对象的所有方法, 设置对象中s的值。

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test { private String s; public String getS() { return s; } public void setS(String s) { this.s = s; } public Test() { } public void method1() { } public void method2(int n) { System.out.println("123" + n); } private void method3() { } @Override public String toString() { return "Test{" + "s='" + s + '\'' + '}'; } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class tClazz = Test.class;//获取t对象的Class类型 Field field1 = tClazz.getField("s"); field1.setAccessible(true); Object o1 = tClazz.newInstance(); field1.set(o1, "s"); System.out.println(field1); System.out.println("Test类的所有属性:"); Field[] declaredFields = tClazz.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } System.out.println("Test类的指定属性:"); Field declaredField = tClazz.getDeclaredField("s"); System.out.println(declaredField); System.out.println("Test类的public方法:"); Method[] methods = tClazz.getMethods(); for (Method method : methods) { System.out.println(method); } System.out.println("Test类的指定方法:"); Method method1 = tClazz.getMethod("method1"); Method method2 = tClazz.getMethod("method2", int.class); Object o = tClazz.newInstance();//通过无参构造获取该类的一个对象 Object invoke = method2.invoke(o, 10); System.out.println(method1); System.out.println(invoke); System.out.println("Test类的所有方法:"); Method[] declaredMethods = tClazz.getDeclaredMethods(); for (Method field : declaredMethods) { System.out.println(field); } System.out.println("Test类的指定方法:"); Method method3 = tClazz.getDeclaredMethod("method3"); System.out.println(method3); System.out.println("Test类的构造参数:"); Constructor[] constructors = tClazz.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } System.out.println("Test类的完整名字:"); String name = tClazz.getName(); System.out.println(name); System.out.println("Test类的所属包:"); Package aPackage = tClazz.getPackage(); System.out.println(aPackage); System.out.println("Test类的父类对象对应的class对象:"); Class superclass = tClazz.getSuperclass(); System.out.println(superclass); System.out.println("设置s的值:"); Field s = tClazz.getDeclaredField("s"); s.setAccessible(true); s.set(o, "肖肖"); System.out.println("s的值为:" + o); } } 使用反射输出学生name和age

2、写一个Student类,包含属性name和age,无参构造方法。使用反射的方式,获取构造方法,创建对象,为name和age赋值,最后输出对象信息

(1)指定属性赋值

import java.lang.reflect.Constructor; import java.lang.reflect.Field; public class Student { public String name; public int age; public Student() { } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException { //获取Class对象 Class studentClass = Student.class; //获取无参构造 Constructor[] declaredConstructors = studentClass.getDeclaredConstructors(); for (Constructor declaredConstructor : declaredConstructors) { System.out.println("获取的构造方法为:" + declaredConstructor); } //通过构造方法创建对象 Student student = studentClass.newInstance(); Field name = studentClass.getDeclaredField("name"); name.set(student, "壳壳"); Field age = studentClass.getDeclaredField("age"); age.set(student, 26); System.out.println("对象student的信息为:" + student); } }

2、获取getset赋值 

import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class Student { private String name; private int age; public Student() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } class StudentTest { public static void main(String[] args) throws Exception, SecurityException { //获取Class对象 Class clazz = Student.class; //获取无参构造 Constructor constructor = clazz.getConstructor(null); //通过构造方法创建对象 Student s = (Student) constructor.newInstance(); //获取setName方法 Method setNameMethod = clazz.getMethod("setName", String.class); //调用setName方法 setNameMethod.invoke(s, "张三"); //获取setAge方法 Method setAgeMethod = clazz.getMethod("setAge", int.class); //调用setAge方法 setAgeMethod.invoke(s, 20); //输出对象信息 System.out.println(s); } }

演示内省

3、定义一个简单的SimpleBean类,类中有name和size两个属性及get和set方法, 演示Java的内省

import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class SimpleBean { public String name; public String size; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSize() { return size; } public void setSize(String size) { this.size = size; } @Override public String toString() { return "SimpleBean{" + "name='" + name + '\'' + ", size=" + size + '}'; } public static void main(String[] args) throws IntrospectionException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { //getBeanInfo获取SimpleBean类的BeanInfo对象 BeanInfo beanInfoSimpleBean = Introspector.getBeanInfo(SimpleBean.class); //定义属性类,获取SimpleBean所有属性并返回PropertyDescriptor对象数组 PropertyDescriptor[] propertyDescriptors = beanInfoSimpleBean.getPropertyDescriptors(); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { System.out.println(propertyDescriptor.getName()); } Class simpleBeanClass = Class.forName("cn.work.SimpleBean"); //获取无参构造方法 Constructor constructor = simpleBeanClass.getConstructor(null); Object s = constructor.newInstance(null); for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { Method readMethod = propertyDescriptor.getReadMethod(); if (readMethod.getName().equals("getName")) { Object readInvoke = readMethod.invoke(s); } if (readMethod.getName().equals("getSize")) { Object readInvoke = readMethod.invoke(s); } Method writeMethod = propertyDescriptor.getWriteMethod(); if (writeMethod != null) { if ("setName".equals(writeMethod.getName())) { Object o = writeMethod.invoke(s, "abc"); } } if (writeMethod != null) { if ("setSize".equals(writeMethod.getName())) { Object o = writeMethod.invoke(s, "20"); } } } System.out.println(s); } }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有