java反射 练习题

为了回忆起来,于是重新找了几道练习题做了下

package cn.incast.homework30;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Scanner;

public class Reflect {
    public static void main(String[] args) throws Exception {
        // fanxingDemo();
        // newObject1();
        // newObject2();
        // printStr();
        // showObj();
        // setProperty(new Person(), "name", "张三");
        // beanDemo();
        // run();
//      System.out.println(getProperty(new Person(), "age"));

    }

    // 8. 写一个方法,此方法可以获取obj对象中名为propertyName的属性的值
    public static Object getProperty(Object obj, String propertyName)throws Exception {
            Class c =obj.getClass();
            Field f =c.getDeclaredField(propertyName);
            f.setAccessible(true);
            Object fValue = f.get(obj);
//          System.out.println(fValue);
            return fValue;
    }

    // 7.(1)写一个Properties格式的配置文件,配置类的完整名称。
    // (2) 写一个程序,读取这个Properties配置文件,获得类的完整名称并加载这个类,
    // (3)用反射 的方式运行run方法。
    private static void run() throws Exception {
        Properties pro = new Properties();
        // 注意:如果是用Eclise的话,切记要右键工程名字,新建一个file文件,因为如果file文件不在工程根目录的话,它是找不到的。
        FileReader fr = new FileReader("config.properties");
        pro.load(fr);
        fr.close();

        String className = pro.getProperty("className");
        String MethodName = pro.getProperty("MethodName");
        Class c = Class.forName(className);
        Object obj = c.newInstance();
        Method method = c.getMethod(MethodName);
        method.invoke(obj);

    }

    // 6.定义一个标准的JavaBean,名叫Person,包含属性name、age。
    // 使用反射的方式创建一个实例、调用构造函数初始化name、age,使用反射方式调用setName方法对名称进行设置,
    // 不使用setAge方法直接使用反射方式对age赋值。
    private static void beanDemo() throws Exception {
        Class c = Class.forName("cn.incast.homework30.Person");
        Constructor con = c.getConstructor(String.class, int.class);
        Object obj = con.newInstance("小明", 16);
        c.getMethod("setName", String.class).invoke(obj, "小丽");// 反射方式调用setName方法对名称进行设置
        Field f = c.getDeclaredField("name");
        f.setAccessible(true);
        System.out.println(obj);

    }

    // 5. 写一个方法,此方法可将obj对象中名为propertyName的属性的值设置为value.
    public static void setProperty(Object obj, String propertyName, Object value)
            throws Exception {
        Class c = obj.getClass();
        Field f = c.getDeclaredField(propertyName);// 获得包括私有和公有的属性
        f.setAccessible(true);// 还要配合这个,取消权限检查,才能设置属性
        f.set(obj, value);

        System.out.println(obj);
    }

    // 4.编写一个类A,增加一个实例方法showString,用于打印一条字符串,在编写一个类TestA
    // ,作为客户端,用键盘输入一个字符串,该字符串就是类A的全名,
    // 使用反射机制创建该类的对象,并调用该对象中的方法showString
    private static void showObj() throws Exception {
        Scanner s = new Scanner(System.in);
        System.out.println("输出一个类的全名");
        Class c = Class.forName(s.nextLine());
        Object obj = c.newInstance();
        Method method = c.getMethod("showString");
        method.invoke(obj);
    }

    // 3. 编写一个类,增加一个实例方法用于打印一条字符串。并使用反射手段创建该类的对象, 并调用该对象中的方法。
    private static void printStr() throws Exception {
        Class c = Class.forName("cn.incast.homework30.Person");
        // Person p = new Person();
        Object p = c.newInstance();

        Method method = c.getMethod("print");

        method.invoke(p);
    }

    // 2. 用反射去创建一个对象,有2种方式,尽量用代码去体现
    private static void newObject1() throws Exception {
        Class c = Class.forName("cn.incast.homework30.Person");
        Constructor cons = c.getConstructor(String.class, int.class);
        Object obj = cons.newInstance("小明", 20);
        System.out.println(obj);
    }

    private static void newObject2() throws Exception {
        Class c = Class.forName("cn.incast.homework30.Person");
        Object obj = c.newInstance();
        System.out.println(obj);
    }

    // 1.泛型类型擦除
    private static void fanxingDemo() throws Exception {
        ArrayList<String> array = new ArrayList<String>();
        array.add("begin");
        Class c = Class.forName("java.util.ArrayList");
        Method method = c.getMethod("add", Object.class);
        method.invoke(array, 20);

        for (Object obj : array) {
            System.out.println(obj);
        }
    }

}

原文地址:https://www.cnblogs.com/czy16/p/8365452.html

时间: 2024-11-06 20:22:56

java反射 练习题的相关文章

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

java 反射类的理解与应用

本文主要解析的类是: ClassLodaer,Class,Field,Method,Constructor. 本文的目标很简单,只是对这些常用的反射类进行简单解释.对这些类中常用方法进行介绍. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java 反射,开发框架必备技能

通过反射技术我们将上面的统一资源定位付(URL) 映射到Class 相当于 class: news method: list parameter: 2 差不多就是下面样子 class News{ public String list(String catagory_id){ ... ... } } 我们只需要在框架核心中分析 url 然后调用对应的方法下载,于此同时将参数传递过去. Class<?> cls = Class.forName("cn.netkiller.reflect.

Java反射与代理

Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1       Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod()