昨天到面试了一次,问了几个懵逼的问题,可能是自己没有准备好吧
1.什么是反射,反射作用?
答:反射机制的作用 1.反编译 .class->.java 2.通过反射机制访问java的属性,方法,构造方法等。
现在特地写个它的功能实现:
1.反射机制获取类有三种方法,我们来获取Person类型
//第一种方法
class c1=Class.forName("Person");
//第二种方法
class c2=Person.class;
//第三种方法
//java语言中任何一个对象都有getClass方法
Person p=new Person();
Class c3=p.getClass;
2.创建对象:获取类以后我们来创建它的对象,利用newInstance;
class c=Class.forName(“Person”);
Object o=c.newInstance();
3.获取属性:分为获取所有属性和特定属性
a.获取所有属性
- //获取整个类
- Class c = Class.forName("java.lang.Integer");
- //获取所有的属性?
- Field[] fs = c.getDeclaredFields();
- //定义可变长的字符串,用来存储属性
- StringBuffer sb = new StringBuffer();
- //通过追加的方法,将每个属性拼接到此字符串中
- //最外边的public定义
- sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
- //里边的每一个属性
- for(Field field:fs){
- sb.append("\t");//空格
- sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
- sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
- sb.append(field.getName()+";\n");//属性的名字+回车
- }
- sb.append("}");
- System.out.println(sb);
b.获取特定的属性
//反射的作用 通过反射获取java对象的属性,方法,构造方法 public static void main(String[] args) { try { //获取class类 Class clzz=Class.forName("com.icz.test.model.Test"); //获取id Field field=clzz.getDeclaredField("id"); //实例化对象 Object o=clzz.newInstance(); //使用反射可以打破封装,导致了java对象的属性不安全 field.setAccessible(true); //o对象的id属性赋值 field.set(o,100); System.out.println("id:"+field.get(o)); }catch (Exception e){ e.printStackTrace(); } }4,获取方法,和构造方法,不再详细描述,只来看一下关键字:
方法关键字 |
含义 |
getDeclaredMethods() |
获取所有的方法 |
getReturnType() |
获得方法的放回类型 |
getParameterTypes() |
获得方法的传入参数类型 |
getDeclaredMethod("方法名",参数类型.class,……) |
获得特定的方法 |
|
|
构造方法关键字 |
含义 |
getDeclaredConstructors() |
获取所有的构造方法 |
getDeclaredConstructor(参数类型.class,……) |
获取特定的构造方法 |
|
|
父类和父接口 |
含义 |
getSuperclass() |
获取某类的父类 |
getInterfaces() |
获取某类实现的接口 |
2.多线程同步(七种)
为何使用同步?
java允许多线程并发控制,当多个线程同时操作一个变量时,将会导致数据不一致的情况,互相之间有冲突,因此加入同步锁避免该线程没有完成操作之前,被其它线程的调用,从而保证该变量唯一性和准确性。
1.使用synchronized关键字修饰方法与代码块。
2. volatile关键字为域变量的访问提供了一种免锁机制。
3. java.util.concurrent包来支持同步,reentrantLock类时可重入,互斥,实现了lock接口的锁。
reentrantLock类的常用方法有:
ReentrantLock:创建一个ReentrantLock实例
lock:获得锁
unLock:释放锁。
4.使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其它线程产生影响。
5. 使用linkedBlockQueuq 队列来实现线程同步。