面试那点事(一)

昨天到面试了一次,问了几个懵逼的问题,可能是自己没有准备好吧

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.获取所有属性

  1. //获取整个类  
  2.             Class c = Class.forName("java.lang.Integer");  
  3.               //获取所有的属性?  
  4.             Field[] fs = c.getDeclaredFields();  
  5.        
  6.                    //定义可变长的字符串,用来存储属性  
  7.             StringBuffer sb = new StringBuffer();  
  8.             //通过追加的方法,将每个属性拼接到此字符串中  
  9.             //最外边的public定义  
  10.             sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  
  11.             //里边的每一个属性  
  12.             for(Field field:fs){  
  13.                 sb.append("\t");//空格  
  14.                 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等  
  15.                 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字  
  16.                 sb.append(field.getName()+";\n");//属性的名字+回车  
  17.             }  
  18.       
  19.             sb.append("}");  
  20.       
  21.             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()

获取某类实现的接口

这样我们可以获取类的各种内容,进行反编译。对于java这种先编译后运行的语音来说,反射机制可以使的代码更加灵活,更加容易实现面向对象。


2.多线程同步(七种)

为何使用同步?

java允许多线程并发控制,当多个线程同时操作一个变量时,将会导致数据不一致的情况,互相之间有冲突,因此加入同步锁避免该线程没有完成操作之前,被其它线程的调用,从而保证该变量唯一性和准确性。

1.使用synchronized关键字修饰方法与代码块。

2. volatile关键字为域变量的访问提供了一种免锁机制。

3.  java.util.concurrent包来支持同步,reentrantLock类时可重入,互斥,实现了lock接口的锁。

       reentrantLock类的常用方法有:

  ReentrantLock:创建一个ReentrantLock实例

  lock:获得锁

  unLock:释放锁。

 4.使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其它线程产生影响。

 5. 使用linkedBlockQueuq 队列来实现线程同步。      

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值