1.关于反射还有一些需要补充的

package reflect;

public class HiddenClass {
public A HiddenA(){
return new A();
}
} class A{
private final String s = "I am totally safe!"; public String getString(){
return s;
} private void print(){
System.out.println("call method print() in Class A");
}
}

  和上面的类不在同一包下,写一个测试类:

import java.lang.reflect.Field;
import java.lang.reflect.Method; import reflect.*; public class HiddenClassTest { public static void main(String[] args) throws Exception{
//A a = new A(); error: A can not be sloved HiddenClass hc = new HiddenClass();
//A a = hc.HiddenA(); error
Object a = hc.HiddenA(); Method m = Class.forName("reflect.A").getDeclaredMethod("print");
m.setAccessible(true);
m.invoke(a); Field f = Class.forName("reflect.A").getDeclaredField("s");
f.setAccessible(true);
f.set(a, "no you are not safe!");
m = Class.forName("reflect.A").getDeclaredMethod("getString");
m.setAccessible(true);
System.out.println(m.invoke(a));
} }

  运行结果为:

call method print() in Class A
I am totally safe!

  对上述代码的说明:

  1. 类的默认构造方法的修饰符是和所在类的修饰符一致的,reflect.A类的修饰符是缺省,则reflect.A类的缺省的构造方法也就是缺省的。

   在和reflect.A不同包下面的类,例如HiddenClassTest就无法直接构造reflect.A的实例。和reflect.A在同一个包下面的类是可以直接new出一个新对象的。

      普通类构造方法的修饰符只能是public和缺省,内部类的修饰符可能是private,protected,构造方法的修饰符可以是private和protected。

  2. 利用将构造方法置为缺省修饰符可以避免其他包中的类直接构造、调用类的方法,但是通过反射,不管是上面的情形,还是内部类、匿名内部类的情形,都是可以进行访问的。反射就是后门,能解决一些特定的问题。

  3. 利用反射可以调用private方法,修改private类型的变量的值,但是无法修改final类型变量的值,这一点需要注意。final修饰基本变量和String时,值无法改变,final修饰修饰非基本变量时,只会初始化一次。

  4. 使用stacic和final修饰的基本变量和String被称为常量,值无法改变,使用stacic和final修饰修饰非基本类型时,值是可以改变的。 

 2.Java数组

  Java中多维数组的例子如下:

package array;

import java.util.Arrays;

public class MultiDimensionalArrayTest {

    public static void main(String [ ] args) {
int [] [] a = new int [3] [];
int [] [] b = new int [] []{{1,2},{3,4,5},{6,7,8,9}}; //每行中元素个数不同的数组也被称为粗糙数组
int [] [] c = {{1,2},{3,4,5},{6,7,8,9}};
int [] [] [] d = new int [3] [] []; System.out.println(Arrays.deepToString(a));
System.out.println(Arrays.deepToString(b));
System.out.println(Arrays.deepToString(c));
} }

  输出为:

[null, null, null]
[[1, 2], [3, 4, 5], [6, 7, 8, 9]]
[[1, 2], [3, 4, 5], [6, 7, 8, 9]]

《Thinking in Java》学习笔记(七)的更多相关文章

  1. Java学习笔记七——数组工具类Arrays

    数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> ...

  2. Java 学习笔记 (七) Java 参数

    head first java page 74 实参: argument 形参: parameter 方法会运用形参, 调用的一方会传入实参. 实参是传给方法的值.当它传入方法后就成了形参, 参数跟局 ...

  3. Java学习笔记七(目录操作)

    1.介绍 上一篇博客介绍的是java中经常使用的操作文件的方式,本篇博客着重解说一下,在Java中是怎样来操作目录的.主要是利用的是Java.IO包以下的File类,本篇博客着重解说一下该类的构造函数 ...

  4. Java学习笔记七:Java的流程控制语句之switch

    Java条件语句之 switch 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试分数,给予前四名不同的奖品.第一名,奖励笔记本一台:第二名,奖励 IPAD 2 一个: ...

  5. Java学习笔记七 常用API对象三

    一.泛型:简单说就是对对象类型进行限定的技术 public class GenericDemo { public static void main(String[] args){ /*泛型作为1.5版 ...

  6. 20145330第七周《Java学习笔记》

    20145330第七周<Java学习笔记> 第十三章 时间与日期 认识时间与日期 时间的度量 GMT(格林威治标准时间):现在不是标准时间 世界时(UT):1972年UTC出来之前,UT等 ...

  7. 20145230《java学习笔记》第七周学习总结

    20145230 <Java程序设计>第7周学习总结 教材学习内容 Lambda语法概览 我们在许多地方都会有按字符串长度排序的需求,如果在同一个方法内,我们可以使用一个byName局部变 ...

  8. Java IO学习笔记七:多路复用从单线程到多线程

    作者:Grey 原文地址:Java IO学习笔记七:多路复用从单线程到多线程 在前面提到的多路复用的服务端代码中, 我们在处理读数据的同时,也处理了写事件: public void readHandl ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  10. 20145330第九周《Java学习笔记》

    20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...

随机推荐

  1. 来说说datatype

    今天敲代码一直卡在一个问题上面好久那就是--datatype的未定义,起初不晓得datatype的含义,遇到这种情况首先想到的就是自己又忘记加上面头文件了.随即写了个stdlib.h上去.可是问题并没 ...

  2. 在echarts3中使用字符云

    echarts2的官方API里是带有字符云的,但到了echarts3就被从官网上移除了,想要使用的话可以从github上下载: 下载地址:https://github.com/ecomfe/echar ...

  3. HDU 2682 Tree

    题目: There are N (2<=N<=600) cities,each has a value of happiness,we consider two cities A and ...

  4. vue引入新版 vue-awesome-swiper填坑

    关于新版 vue-awesome-swiper 问题 为什么我的vue-awesome-swiper组件pagination小圆点不显示问题? 为什么我的vue-awesome-swiper不会自动播 ...

  5. 【蓝桥杯单片机02】LED的基本控制

    [蓝桥杯单片机02]LED的基本控制 广东职业技术学院  欧浩源 在CT107D单片机综合训练平台实现LED的基本控制和其他单片机开发平台不一样,不单单是控制几个LED实现跑马灯这么简单.因为在这个平 ...

  6. ngRx 官方示例分析 - 5. components

    组件通过标准的 Input 和 Output 进行操作,并不直接访问 store. /app/components/book-authors.ts import { Component, Input ...

  7. [SinGuLaRiTy] 复习模板-数学

    [SinGuLaRiTy-1047] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 质因数分解 void solve(int n) { == ...

  8. android 基础03 -- Intent

    Android 中的 Intent 是将要执行的操作的一种抽象的描述,是一个用于Android 各个组件之间传递消息的对象. Intent 的基本用法 Intent 基本的使用方法主要有三种: 启动一 ...

  9. 怎样用PS对照片进行美白?

    摘录自:http://product.pconline.com.cn/itbk/software/ps/1408/5336118.html 步骤1.打开需要美白肤色的照片.本教程为防止侵犯他人肖像权, ...

  10. Spring+JTA+Atomikos+mybatis分布式事务管理

    我们平时的工作中用到的Spring事务管理是管理一个数据源的.但是如果对多个数据源进行事务管理该怎么办呢?我们可以用JTA和Atomikos结合Spring来实现一个分布式事务管理的功能.了解JTA可 ...