java面试第七天
反射:
反射:在运行时动态分析或使用一个类进行工作。
java.lang.Class类:描述类信息的类。
类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Class是类对象的类型。
获得类对象的方式:
用" 类名.class "获得这个类的类对象。
用类的对象掉用getClass(),如object.getClass()得到这个对象的类型的类对象。
可以使用Class.forName(类名),也可以得到这个类的类对象,(注意,这里写的类名必须是全限定名(全名),是包名加类名,XXX.XXX.XXXX)。
基本类型也有类对象,用" 封装类.TYPE "可以获得对应的基本类型的类对象。
java.lang.reflect包下的三个重要类:
Field属性类:用来描述属性的信息。
Method方法类:方法的信息的描述。
Constructor构造方法类:用来描述构造方法的信息。
Class类中的常用方法:
newInstance()
创建此 Class 对象所表示的类的一个新实例(调用无参构造创建的对象)。
getDeclaredMethods()
获得的是一个Method方法类对象的数组,获得本类(不包括父类)声明的所有(包括private的)方法对象。
getMethods() //推荐使用
获得的是一个Method方法类对象的数组,获得所有(父类的也包括)publice的方法对象。
getDeclaredConstructors()
获得的是一个Constructor构造方法类对象的数组,获得这个类声明的所有构造方法对象。
getConstructors() //推荐使用
获得的是一个Constructor构造方法类对象的数组,获得所有publice的构造方法对象。
getDeclaredFields() //推荐使用
获得的是一个Field属性类对象的数组,获得本类声明的所有属性的属性对象。
getFields()
获得的是一个Field属性类对象的数组,获得所有publice的属性对象。
使用反射构造一个类的对象的步骤:
a. 获得类对象
b. 获得构造方法对象
c. 获得对象,用构造方法对象调用构造方法,如果使用无参构造方法,可以跳过第二步,直接使用" 类对象.newInstance() "方法来获得这个类的对象
d. 获得方法对象
e. 用方法对象调用方法(用这个类的对象作为第一参数)
如下面的例子:
反射机制的实现类:
package day07.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class TestReflect {
public static Object get(String className , Map<String,Object> map) throws Exception{
Class c = Class.forName(className); //获得类对象
Object o = c.newInstance(); //获得对象
Set<String> set = map.keySet();
for(String str : set){
String s = "set" + str.substring(0,1).toUpperCase()+str.substring(1);
Field f = c.getDeclaredField(str);
Method m = c.getMethod(s, f.getType()); //获得方法对象
m.invoke(o, map.get(str)); //用方法对象调用方法
}
return o;
}
public static void main(String[] args) throws Exception {
Map m = new HashMap();
m.put("name", "zhang");
m.put("age", 22);
Object o = get("day07.reflect.Student",m);
Student s = (Student) o;
System.out.println(s.getName() + " " + s.getAge());
Map m1 = new HashMap();
m1.put("name", "li");
m1.put("gender", "男");
Object o1 = get("day07.reflect.Teacher",m1);
Teacher t = (Teacher) o1;
System.out.println(t.getName() + " " + t.getGender());
}
}
学生类:
package day07.reflect;
public class Student {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
教师类:
package day07.reflect;
public class Teacher {
private String name;
private String gender;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
内部类:
定义:
定义在另外一个类中的类,就是内部类。
编译后生成的两个独立的类:Outer.class 和Outer$Inner.class。
内部类的分类:
静态内部类:静态内部类定义在类中,任何方法外,用static修饰
静态内部类只能访问外部类的静态成员。
在外部类的外部,要创建一个静态内部类对象不需要外部类对象:
Outer.Inner in = new Outer.Inner();
在本类内部生成内部类对象的方式:
Inner in = new Inner();
成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列
在内部类中可以直接访问外部类的私有属性。
内部类和外部类的实例变量允许命名冲突。
在内部类中访问实例变量:this.属性
在内部类访问外部类的实例变量:外部类名.this.属性
在外部类的外部,要创建一个成员内部类对象,要首先建立一个外部类对象,然后再创建一个成员内部类对象。
Outer out = new Outer();
Outer.Inner in = out.new Inner();
在本类内部生成内部类对象的方式:
在静态方法中:Inner in = new Outer().new Inner();
在非静态方法中:Inner in = this.new Inner();
成员内部类不可以有静态成员,这是因为静态属性是在加载类的时候创建,这个时候内部类还没有被创建。
局部内部类:在外部类的方法中定义的内部类
与局部变量类似,在局部内部类前不可以加修饰符public和private,其作用域为定义它的代码块。
局部内部类不仅可以访问外部类的实例变量,还可以访问外部类的局部变量,但要求外部类的局部变量必须为final的。
配合接口使用,来做到强制弱耦合。
在外部类的外部不可创建局部内部类对象,只能在局部内部类所在的方法中创建:
Inner in = new Inner();
匿名内部类:一种特殊的局部内部类
没有名字,也没有class、extends、implements关键字
用一种隐含的方式实现一个接口或继承一个类,并且只能创建一次实例。
实现方式:在某个语句中,new 父类/父接口名字(){ 类体中实现方法 }
例如:
TreesSet ts = new TreeSet(new Comparator(){
public int compare(Object o1, Object o2){
return 0;
}
});
匿名内部类属于局部内部类,那么局部内部类的所有限制都对其生效。
匿名内部类是唯一一种无构造方法的类,因为构造器的名字必须合类名相同,而匿名内部类没有类名。
java面试第七天的更多相关文章
- java面试 (七)- 关于String
1 String的定义(Java8中) // final的类,不能被继承// 继承了序列化接口,comparable接口,public final class String implements ja ...
- Java 面试知识点解析(七)——Web篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java面试集合(七)
前言: Java面试集合(六) 的回顾,对于final可以修饰常量,方法,和类,一旦常量定义好后就不可改变,而方法,用final来修饰方法,方法不可重载,继承,重写,final用来修饰类,该类不能被继 ...
- Java面试必备知识
JAVA面试必备知识 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可 ...
- Java 面试宝典-2017
http://www.cnblogs.com/nelson-hu/p/7190163.html Java面试宝典-2017 Java面试宝典2017版 一. Java基础部分........... ...
- Java面试宝典-2017
Java面试宝典2017版 一. Java基础部分........................................................................... ...
- Java 面试知识点解析(五)——网络协议篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- 分享13道上海尚学堂拿回来的Java面试真题,这些都是Java核心常见问题,想拿OFFER必看!
上海尚学堂Java培训学员参加面试带回来的真题,分享出来与大家,希望大家能认真地看看做一遍.后面有详细题解答案,对照下,看看自己做得怎么样,把这些面试遇到的真题全部掌握,做好面试笔试前的准备. 一.1 ...
- Java面试大纲-java面试该做哪些准备,java开发达到这样的水平可以涨工资
Java培训结束,面临的就是毕业找工作.在找工作时,就要针对性地做充分的面试准备.准备不充分的面试,完全是浪费时间,更是对自己的不负责. 上海尚学堂Java培训整理出Java面试大纲,其中大部分都是面 ...
随机推荐
- 快速搭建简单的LBS程序——地图服务
很多时候,我们的程序需要提供需要搭建基于位置的服务(LBS),本文这里简单的介绍一下其涉及的一些基本知识. 墨卡托投影 地图本身是一个三维图像,但在电脑上展示时,往往需要将其转换为二维的平面图形,需要 ...
- thread_indent
http://blog.csdn.net/justlinux2010/article/details/10269033
- 埃及分解:将2/n分解成为1/x+1/y的格式
算法 古埃及以前创造出灿烂的人类文明,他们的分数表示却非常令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比方,2/1 ...
- 在EntityFramework6中管理DbContext的正确方式——4DbContextScope:一个简单的,正确的并且灵活的管理DbContext实例的方式(外文翻译)
(译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...
- C#程序集系列02,使用记事本查看可执行程序集的IL代码
继续上一篇"C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序",在F盘的as文件夹中已经有了若干程序集.本篇体验使用记事本查看可执行程序集的IL代码 ...
- msgpack配合FIREDAC传输多表数据
msgpack配合FIREDAC传输多表数据 procedure TForm1.Button1Click(Sender: TObject);var ms, ms2: TMemoryStream; pa ...
- 解决sqoop报错:java.lang.OutOfMemoryError: Java heap space
报错栈: -- ::, INFO [main] org.apache.sqoop.mapreduce.db.DBRecordReader: Executing query: = ) AND ( = ) ...
- python内置函数和魔法函数
内置方法:Python中声明每一个类系统都会加上一些默认内置方法,提供给系统调用该类的对象时使用.比如需要实例化一个对象时,需要调用该类的init方法:使用print去打印一个类时,其实调用的是str ...
- VS2010调试技巧
最近合作开发,代码已经完成了,但是一调试,错误一大堆,由于是合作开发,不确定是哪层的错误,得一步步得走,很是费时费力,平时调试的技巧用的不多,现在集中调试,结果有些手忙脚乱,效率也很低,所以在网上找了 ...
- scala 学习笔记十 一 伴生对象
1.介绍 a.所谓伴生对象就是和某个class同名的object, 并且object 必须和class在同一个scala源文件中. b.在scala中,没有像java中的静态类,静态方法和静态成员等, ...