• 2017年4月24号课堂笔记


    2017年4月24号  晴  空气质量:中度污染

    内容:反射及相关,java设计六大原则(自学)

    一、反射机制

    在 程序运行期间,对于任何一个类,都能获得它的所有方法和属性!
    对于任何一个对象,都能调用它的任意方法和属性!
    这种动态获取类的信息 或者动态调用对象的方法或者属性的功能! ===》java 反射机制

    二、反射Demo

    老师代码:

    1)学生实体类:

    package cn.bdqn.bean;
    //学生实体类
    public class Student extends Person {

    private String name; // 私有化的姓名
    public String address; // 公共的地址
    protected int age; // 受保护的年龄
    char sex; // 默认权限的性别

    static {
    System.out.println("student类中静态代码块!01");
    }

    {
    System.out.println("student类中普通代码块!02");
    }

    public Student() {
    System.out.println("student类中无参构造03");
    }

    // 私有的方法
    private String getWords(String name) {
    return name + "====>大家辛苦了!";
    }

    public String getName() {
    return name;
    }

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

    public String getAddress() {
    return address;
    }

    public void setAddress(String address) {
    this.address = address;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }

    public char getSex() {
    return sex;
    }

    public void setSex(char sex) {
    this.sex = sex;
    }

    }

    2)父类person类:

    package cn.bdqn.bean;

    //父类人类
    public class Person {

    }

    3)反射测试类:

    package cn.bdqn.bean;
    //反射测试类
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;

    import org.junit.Test;

    public class ReflectTest {

    /**
    * 对象名.getClass() === 类名.class
    * 都是获取类的class 实例
    *
    * 所有类的实例 都是Class类的对象
    */
    @Test
    public void test01() {
    Student stu = new Student();
    System.out.println("stu对象所属类的父类" + stu.getClass().getSuperclass());
    System.out.println("Student类的父类" + Student.class.getSuperclass());
    }

    @Test
    public void test02() {
    Integer a = 5;
    System.out.println(a.getClass().getSuperclass());
    Class<?>[] interfaces = Integer.class.getSuperclass().getInterfaces();
    for (Class<?> class1 : interfaces) {
    System.out.println(class1.getName());
    }
    }

    // 三种方式获取指定类的完整限定名 (全类名==包名+类名)
    @Test
    public void test03() {
    try {
    // 01. 常用(推荐)
    System.out.println(Class.forName("cn.bdqn.bean.Student").getName());//此时会把类加载到JVM中!!
    System.out.println(Class.forName("cn.bdqn.bean.Student")
    .getSimpleName()); // 简单类名
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    @Test
    public void test04() {
    // 02.
    System.out.println(Student.class.getName()); // 类名点
    }

    @Test
    public void test05() {
    // 03.
    System.out.println(new Student().getClass().getName()); // 对象点
    }

    // 获取包名
    @Test
    public void test06() {
    try {
    Class c = Class.forName("cn.bdqn.bean.Student");
    System.out.println(c.getPackage().getName());
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    // 获取类的修饰符
    @Test
    public void test07() {
    try {
    Class c = Class.forName("cn.bdqn.bean.Student");
    System.out.println("类的修饰符===》"
    + Modifier.toString(c.getModifiers()));
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    // 获取属性的相关信息
    @Test
    public void test08() {
    try {
    Class c = Class.forName("cn.bdqn.bean.Student");
    // Field[] fields = c.getFields();// 获取public修饰的属性
    Field[] fields = c.getDeclaredFields(); // 获取所有的属性
    for (Field field : fields) {
    System.out.println(field);
    }
    System.out.println("获取所有属性的名称");
    for (Field field : fields) {
    System.out.println(field.getName());
    }
    System.out.println("获取所有属性的修饰符");
    for (Field field : fields) { // default的int 是0
    System.out.println(Modifier.toString(field.getModifiers()));
    }
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    }

    // 通过反射获取类中的构造方法
    @Test
    public void getConstructors() throws Exception {
    Class c = Class.forName("cn.bdqn.test.Student"); // 加载静态代码块
    Constructor[] constructors = c.getDeclaredConstructors();
    for (int i = 0; i < constructors.length; i++) {
    System.out.println("构造的修饰符:"
    + Modifier.toString(constructors[i].getModifiers()));
    System.out.println("构造的名称:" + constructors[i].getName());
    /**
    * 1.8才有getParameterCount

    System.out
    .println("构造的参数个数:" + constructors[i].getParameterCount());
    */
    Class[] types = constructors[i].getParameterTypes(); // 参数的类型
    for (Class class1 : types) {
    System.out.println("参数类型的名称:" + class1.getName());
    System.out.println("参数的类型简写:" + class1.getSimpleName());
    }
    System.out.println("******************************");
    }
    }

    // 通过反射观察执行顺序
    @Test
    public void test09() {
    // Student stu = new Student(); 耦合
    try {
    Class c = Class.forName("cn.bdqn.bean.Student");
    Student student = (Student) c.newInstance(); // 解耦合
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    }
    }

    // 调用类的私有方法
    @Test
    public void test10() throws Exception {
    Class c = Class.forName("cn.bdqn.bean.Student"); // 没有实例化对象
    // 获取类中所有的方法
    Method[] methods = c.getDeclaredMethods();
    Method method = c.getDeclaredMethod("getWords", String.class);
    // 实例化对象
    Student stu = (Student) c.newInstance();
    // 打开开关
    method.setAccessible(true);
    // 执行方法
    String result = (String) method.invoke(stu, "小黑");
    System.out.println(result);
    }

    }

    三、传参中的一种模式(...)

    老师代码:

    1)参数...类

    package cn.bdqn.bean;

    //参数...类
    public class ArrayPPP {

    /**
    * ...的注意事项:
    * 01.底层就是一个数组,操作它就是操作我们的数组
    * 02.在作为参数的时候,必须位于参数列表的最后一个位置
    * 03.它可以是0-N个数据的组合
    * 04.只能作为参数,并不能代替数组的声明
    */
    public static void main(String[] args) {
    int[] nums = { 1, 2, 3, 4, 5 };
    changeNums(500);
    System.out.println(nums[0]);
    }

    private static void changeNums(int num, int... nums) {
    nums[0] = num;
    }

    /**
    * private static void changeNums(int num, int [] nums) {
    nums[0] = num;
    }*/

    }

    2)测试类

    package cn.bdqn.bean;

    //测试类
    public class PTest {

    public static void main(String[] args) {
    String[] words = test("a", "n", "c");
    // 会把"a", "n", "c" 封装成一个String类的数组 传给 words
    System.out.println(words[0]);
    }

    public static String[] test(String... words) {
    words[0] = "5555";
    for (String s : words) {
    System.out.println(s);
    }
    return words;
    }

    }

    四、java设计中的六大原则

    转载自:http://blog.csdn.net/cq361106306/article/details/38708967

    五、作业

    1、总结U1的MindManager(周三上课前交ftp)

    2、写soso,周五考试+答辩

    3、周四晚上考linux和hadoop命令

    六、老师辛苦了!

     

  • 相关阅读:
    IOS之helloworld
    xcode4.2中创建Navigation-Based Application
    IOS之数据持久化
    IOS之多视图应用程序
    IOS之高级控件表视图
    IOS之基本UI控件
    IOS之导航控制器与表视图
    IOS之应用程序设置
    IOS之高级控件拾取器
    IOS之UI基础
  • 原文地址:https://www.cnblogs.com/wsnedved2017/p/6756199.html
Copyright © 2020-2023  润新知