头歌(educoder)第 5 章 Java 面向对象之类和对象 Java高级特性 - Java反射

目录

第1关:了解 Class 对象

第2关:利用反射分析类的能力

第3关:在运行时使用反射分析对象

第4关:利用反射进行方法调用


第1关:了解 Class 对象

package step1;

/**
 * 学员任务文件
 */
public class Reflect_stu {

    public static void main(String[] args) {
        System.out.println("通过Object 类中的 getClass() 获取的 Class 对象为:" + getPersonClass1());
        System.out.println("通过静态方法 Class.forName() 获取的 Class 对象为:" + getPersonClass2());
        System.out.println("通过类字面常量获取 Class 的对象为:" + getPersonClass3());
    }

    /**
     * 通过 Object 类中的 getClass() 获取的 Class 对象
     *
     * @return
     */
    public static Class getPersonClass1() {
        /********** Begin *********/
    Person person = new Person();
		Class clazz1 = person.getClass();

		return clazz1;
        /********** End *********/
    }

    /**
     * 通过静态方法 Class.forName() 获取的 Class 对象
     * <p>
     * 注意:Person 类的全路径为: step1.Person
     *
     * @return
     */
    public static Class getPersonClass2() {
        /********** Begin *********/
    String className = "step1.Person";
		Class clazz2 = null;
		try {
			clazz2 = Class.forName(className);
		} catch (ClassNotFoundException e) {
		}

		return clazz2;
        /********** End *********/
    }

    /**
     * 通过类字面常量获取 Class 的对象
     *
     * @return
     */
    public static Class getPersonClass3() {
        /********** Begin *********/
        Class clazz3 = Person.class;

		return clazz3;

        /********** End *********/
    }
}

第2关:利用反射分析类的能力

package step2;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

class Apple {
    private String name;
    public Apple(){}
    public Apple(String name){}
    public void setName(String name) {
        this.name = name;
    }
}

public class Reflect_stu {

    public static void main(String[] args) {
        // 请根据提供的 classPath 获取 step2.Apple 的 Class 对象, 请使用 Class.forName() 方法, 注意捕获异常
        // 通关之后,你也可以修改 clasapath 为其他类路径,分析某个类的能力, 例如: java.util.Date
        String classPath = "step2.Apple";
        Class clazz = null;
        /********** Begin *********/
        try {
			clazz = Class.forName(classPath);

		} catch (ClassNotFoundException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
        /********** End *********/
        printFields(clazz);
        printConstructors(clazz);
        printMethods(clazz);
    }
    
  	/**
     * 请打印类的每个域,输出格式为:修饰符 类型 变量名;
     * @param clazz
     */
    public static void printFields(Class clazz) {
        /********** Begin *********/
        try {
			Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				System.out.print(Modifier.toString(field.getModifiers()) + " ");
				System.out.print(field.getType().getTypeName() + " ");
				System.out.println(field.getName() + ";");
			}
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

        /********** End *********/
    }

    /**
     * 打印构造函数,输出格式为:修饰符 方法名称(参数)
     * @param clazz
     */
    public static void printConstructors(Class clazz) {
 		Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            Class[] paramTypes = null;
            /********** Begin *********/
            paramTypes = constructor.getParameterTypes();

			System.out.print(Modifier.toString(constructor.getModifiers()) + " ");
			System.out.print(constructor.getName() + "(");
            
              
            /********** End *********/
            printParamTypes(paramTypes);
        }
    }

    /**
     * 请针对每个方法打印其签名,格式为:修饰符 返回值类型 方法名称(参数);
     * @param clazz
     */
    public static void printMethods(Class clazz) {
        Method[] methos = clazz.getDeclaredMethods();
        for (Method method : methos) {
            Class[] paramTypes = null;
            /********** Begin *********/
            paramTypes = method.getParameterTypes();

			System.out.print(Modifier.toString(method.getModifiers()) + " " + method.getReturnType().getName() + " "
					+ method.getName() + "(");



            /********** End *********/
            printParamTypes(paramTypes);
        }
    }


    /**
     * 打印方法参数
     * @param paramTypes
     */
    private static void printParamTypes(Class[] paramTypes) {
        for (int j = 0; j < paramTypes.length; ++j) {
            if (j > 0) {
                System.out.print(",");
            }
            System.out.print(paramTypes[j].getName());
        }
        System.out.println(");");
    }
    
}

第3关:在运行时使用反射分析对象

package step3;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Reflect_stu {

    public static String toString(Object obj) {
        Class cl = obj.getClass();
        String r = "";
        r += "[";

        // 请获取所有 Field 并设置访问权限为 true
        /********** Begin *********/
        Field[] fields = null;
        fields = cl.getDeclaredFields();
		AccessibleObject.setAccessible(fields, true);


        /********** End *********/
        for (Field f : fields) {
            // 此处 if,逻辑为判断 Field 域是否为非静态域
            if (!Modifier.isStatic(f.getModifiers())) {
                if (!r.endsWith("[")) r += ",";
                r += f.getName() + "=";
                try {
                    // 请获取域的类型及值
                    /********** Begin *********/

                    Class t = null;
                    Object val = null;
                    t = f.getType();
					val = f.get(obj);



                    /********** End *********/
                    // isPrimitive() 用于判断是否为基本数据类型,若为基础数据类型直接拼接,否则递归调用 toString 方法
                    if (t.isPrimitive()) r += val;
                    else r += toString(val);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        r += "]";
        return r;
    }


    public static void main(String[] args) {
        Person person = new Person(88, 19, 175);
        System.out.println(toString(person));
    }
}

class Person {
    public Integer weight;
    private Integer age;
    private Double height;


    public Person(Integer weight, Integer age, double height) {
        this.weight = weight;
        this.age = age;
        this.height = height;
    }
}

第4关:利用反射进行方法调用

package step4;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Reflect_stu {
    public static void main(String[] args) throws InvocationTargetException {
        //使用反射调用
        Class clazz = null;
        try {
            clazz = Class.forName("step4.Apple");
            /********** Begin *********/
            Constructor cons = clazz.getConstructor();
			Apple apple = (Apple) cons.newInstance();

			Method method = clazz.getMethod("setPrice", double.class);
			method.invoke(apple, 14);

			Method getPrice = clazz.getMethod("getPrice");

			System.out.println(getPrice.invoke(apple));

			Method getTotal = clazz.getMethod("getTotal", double.class, int.class);

			System.out.println(getTotal.invoke(apple, 20, 24));

            /********** End *********/
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


class Apple {
    private double price;
    private int count;

    public Apple() {
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public double getTotal(double price, int count) {
        return price * count;
    }
}

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 头歌educoderjava面向对象是指在Java编程中,采用面向对象的编程思想,将程序中的数据和操作封装成对象,通过对象之间的交互来完成程序的功能。这种编程方式可以提高代码的可读性、可维护性和可扩展性,使程序更加灵活和高效。 ### 回答2: Educoder Java课程中的头歌是关于面向对象编程的内容。面向对象编程是一种编程思想,通过将数据和操作数据的方法封装在一起,以对象的形式组织和管理代码,提高代码的可维护性和可扩展性。 在Java中,面向对象编程的核心是类和对象。类是一种自定义的数据类型,可以定义类的属性和方法来描述对象的特征和行为。而对象是类的一个实例化,具有类属性和方法的特征和行为。 在面向对象编程中,还有三个重要的概念:封装、继承和多态。封装是指将数据和方法封装在一起,对外部隐藏其实现细节,只提供接口给外部使用。继承是指子类继承父类的属性和方法,可以在子类中添加新的属性和方法或覆盖父类的方法。多态是指同一对象在不同情况下的不同表现形式,比如通过子类对象调用重写的父类方法。 Java还提供了接口、抽象类、枚举等特性来扩展面向对象编程的功能,并且有丰富的类库可以方便地操作常见的数据结构和算法。 在Educoder Java课程中,学习面向对象编程可以让我们更好地组织和管理代码,提高代码的可读性、可维护性和可扩展性,从而更好地完成编程任务。同时也可以为后续学习Java Web开发和Android移动应用开发打好基础。 ### 回答3: Educoder Java面向对象是一门面向对象的编程语言课程,学习者将通过此课程学习Java编程语言中的面向对象编程思想,并学习如何使用Java语言进行面向对象编程的实践操作。 在Java语言中,所有的数据和方法都是以类的形式组织的,因此,学生需要掌握类、对象、封装、继承和多态等面向对象编程的核心概念。 学生将学习到Java语言中的类和对象的定义方法,如何定义类的属性和方法,如何创建对象并调用对象的属性和方法。另外,学生还将了解Java语言中的访问控制修饰符,如何使用封装性来保护类的属性和方法,以及如何使用继承来重用代码。 在本课程中,学生还将学习Java中的多态、抽象类和接口等概念以及如何使用它们来设计高效的程序。 此外,本课程还涵盖了Java中的异常处理、文件IO等实际应用场景,帮助学生掌握Java语言的完整编程技能。 综上所述,Educoder Java面向对象课程将为学生提供一个全面而深入的Java编程语言的学习体验,让学生掌握Java语言的核心概念和技能,为学生的未来发展奠定坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值