JAVA 一个类调用另一个类的private方法怎么调?

public class A extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}

public class B{
private void start(){
。。。。。。。。。。
}
}

主类A想调用B类里面的start()方法怎么调用?B是外部类

8个回答

用反射

    public static void main(String[] args) throws Exception {
        A a = new A();
        a.startB();
    }

    public static class A {
        public void startB() throws Exception {
            Method method;
            method = B.class.getDeclaredMethod("start");
            method.setAccessible(true);
            method.invoke(new B());

        }
    }

    public static class B {
        private void start() {
            System.out.println("B is started.");
        }
    }

先声明这个类,下面在调用就行

类的私有方法是不能被其他类调用到的,类的私有方法只能在自己的方法中调用,这就是类的封装的特点,规定了访问权限。

使用反射 你想怎么用就怎么用

图片说明
在私有方法所属类声明另一个方法来调用该私有方法或许可以解决

直接用反射就可以。
另外,为什么会有这个需求呢、

调不到私有方法的,可以用反射实现

new B.start();

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java中如何调用另一个类中的变量
package newpackage; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javafx.scene.chart.PieChart.Data; import javax.swing.JFrame; import javax.swing.JPanel; //窗体类 public class MyFrame extends JFrame { /** * @param args */ JPanel jPanel; char charA; public MyFrame(){ this.setSize(500,100); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("Keylogger"); this.setVisible(true); this.addKeyListener(new MyKeyListener()); jPanel = new JPanel(); add(jPanel); } public static void main(String[] args) { // TODO Auto-generated method stub new MyFrame(); } } class MyKeyListener extends KeyAdapter{ public void keyPressed(KeyEvent e){ char charA = e.getKeyChar(); String s = null; try { s = "You pressed "+charA+" at "+getTime(); } catch (ParseException ex) { Logger.getLogger(MyKeyListener.class.getName()).log(Level.SEVERE, null, ex); } System.out.println(s); } private Date getTime() throws ParseException { Date d = new Date(); String s = null; s = DateFormat.getDateInstance().format(d); s = DateFormat.getDateInstance(DateFormat.DEFAULT).format(d); s = DateFormat.getDateInstance(DateFormat.FULL).format(d); s = DateFormat.getDateInstance(DateFormat.MEDIUM).format(d); s = DateFormat.getDateInstance(DateFormat.SHORT).format(d); DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); s = sdf.format(d); DateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); s = sdf2.format(d); DateFormat sdf3 = new SimpleDateFormat("yyyyMMddHHmmss"); s = sdf3.format(d); s = sdf.format(d); Date today = sdf.parse(s); Calendar c = Calendar.getInstance(); return c.getTime(); } } 如果想新建一个类来调用 class MyKeyListener extends KeyAdapter{ public void keyPressed(KeyEvent e){ char charA = e.getKeyChar(); String s = null; try { s = "You pressed "+charA+" at "+getTime(); } catch (ParseException ex) { Logger.getLogger(MyKeyListener.class.getName()).log(Level.SEVERE, null, ex); } System.out.println(s); } 这里的s,但是不知道该怎么编写 下面是我新建的类: package newpackage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; public class FileWriter { public static void main(String[] args) throws IOException { FileOutputStream f = new FileOutputStream(new File("D:\\temp\\text.txt")); PrintStream p = new PrintStream(f); MyKeyListener m = new MyKeyListener(); p.println(s); p.close(); } 希望各位大神能给我一些帮助,感激不尽
关于java的private修饰
Thinking in java 里有这么一句话:so private allows you to freely change that member without concern that it will affect another class in the same package; 我的理解就是我可以随意改变private成员,不必考虑这么做是否会影响其他类! 但有这样的情况: 一个类a中有private属性,public方法,方法中调用了private属性;然后另一个类b调用此public方法,此时可以运行,但如果把a中private属性更改了,b中就会报错吧,那么private的作用何在? 很是不解,求大神指导!
关于java的private修饰符
Thinking in java 里有这么一句话:so private allows you to freely change that member without concern that it will affect another class in the same package; 我的理解就是我可以随意改变private成员,不必考虑这么做是否会影响其他类! 但有这样的情况: 一个类a中有private属性,public方法,方法中调用了private属性;然后另一个类b调用此public方法,此时可以运行,但如果把a中private属性更改了,b中就会报错吧,那么private的作用何在? 很是不解,求大神指导!
为什么JAVA中一些类用另的一个类的对象来调用?
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegxDemo03 { public static void main(String[] args) { String str = "a-753933" ; String pat ="[abc]-\\d{6}"; Pattern p = Pattern.compile(pat); Matcher m = p.matcher(str); //验证字符串是否合法 if(m.matches()){ System.out.println("格式合格"); }else{ System.out.println("格式不合格"); } } } 感觉有点奇怪,这是一种什么逻辑?直接用一个类来实现不就可以了。具体的像 Pattern p = Pattern.compile(pat); Matcher m = p.matcher(str); //验证字符串是否合法 还有其他一些类,像操作数据库的类也是这样的。 还比如向MySQL的JDBC链接也是这样.比如: Connection con =DriverManager.getConnection(url,username,password); Statement stmt = con.createStatement(); ResultSet rt = stmt.executeQuery(); 我不明白的是为什么需要通过先获得con对象才能通过con对象获得stmt后才能获得rt对象.不明白这种对象的调用原理..新手.才接触java没多久,,希望各位大神能帮忙解惑.说细致点..谢谢..最好能举例说明.. -----------------问答分割线------------------ 昨天提问后.自己从面向对象上找资料复习..然后看到了单例设计模式.因为之前老师在说单例设计模式时一笔带过了..所以印象不深刻..这里给自己的提问做个半总结.因为资料还在看....自我解决问题嘛.. --------------------------------------------- 设计模式:对问题行之有效的解决方式.其实它是一种思想. 1.单例设计模式. 解决的问题:就是可以保证一个类在内存中的对象唯一性. 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性. 如何保证对象唯一性呢? 1.不允许其他程序用new创建该类对象. 2.在该类创建一个本类实例. 3.对外提供一个方法让其他程序可以获取该对象. 步骤: 1.私有化该类构造函数. 2.通过new在本类中创建一个本类对象 3.定义一个公有的方法,将创建的对象返回. 举个简单的例子: class Single { static Single s = new Single( ); private Single( ){} public static Single getInstance( ) { return s; } } class SingleDemo { public static void main(String[] args) { single ss = single.getInstance( ); } } 私有化构造器,通过类名.方法名调用本类的方法返回s.来得到本类中new出来的对象.这就是昨天所提问的一部分解答..还有一部分问题找答案..为什么需要得到一层再调用一层..我也知道这是一种设计模式..只是想更深入的了解它的设计原理.以及优点.. 谢谢各位耐心的解答..等我完全解决了问题..我再结帖.语言组织能力不是太好,希望这些问题能让与我有同样疑惑的伙伴做个最基础的解惑..非常感谢大家的热心回答及帮助..
java 同一个包下如何调用另一个类的方法 代码如下 求帮忙指错
package leexiaobu; public class Leexiaobu{ public static void main(String[]args){ Leexiaobu[] a=new Leexiaobu[3]; a[0]=new Leexiaobu(); a[1]=new Leexiaobu(); a[2]=new Leexiaobu(); for (int i=0;i<3;i++){ a[i].setSize(10+4*i); //________setsize出错_____ } for (int i=0;i<3;i++){ System.out.println("a["+i+"]的值是:"+a[i].getSize());______getsize出错 ![图片说明](https://img-ask.csdn.net/upload/201703/08/1488938987_859829.png)______ } } } class dog{ private int size; int getSize(){ return size; } void setSize(int s){ if (s>0){ size=s; } } }****
关于构造器调用同一个类另个一构造器的问题
在学习CoreJava中,看到一个构造器可以调用同一个类另个一构造器的部分, class Employee { private static int nextId; private int id; private String name; private double salary; static { Random generator=new Random(); nextId=generator.nextInt(1000)+1; } { id=nextId; nextId++; } public Employee(String name,double salary) { this.name=name; this.salary=salary; } public Employee(double s) { this("Employee#"+nextId,s); } public Employee() { } } this("Employee#"+nextId,s); 这句话没看懂,请问有人能帮忙解释一下吗?
java中一个类在另一个类中实例化后,数据会丢失吗?
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import Handler.SqlConnection; import Handler.SqlRegist; import data.User; public class RegistAction extends ActionSupport{ PreparedStatement presql; private User user; public void setUser(User user) { this.user = user; } public User getUser() { return user; } public String execute() throws Exception{ //new SqlRegist().insert(); SqlRegist sr=new SqlRegist(); sr.insert(); return SUCCESS; } } ``` ``` 这个是出现问题的类 package Handler; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import data.User; import tao.min.qi.action.RegistAction; //此类弃用!!! //在action中调用此类出先空指针异常 //此类中亦出现空指针异常 //presql.setString(1, RA.getUser().getUsername()); //RA.getUser().getUsername()无法取得前台的值 //问题出现情况尚未解决!! public class SqlRegist { PreparedStatement presql; RegistAction RA=new RegistAction(); public int insert() throws SQLException { Connection con = new SqlConnection().getConnection(); try { con.setAutoCommit(false); String sql = "INSERT INTO user VALUES(?,?,?)"; presql = con.prepareStatement(sql); presql.setString(1, RA.getUser().getUsername()); presql.setString(2, RA.getUser().getPass()); presql.setString(3, RA.getUser().getPhone()); presql.executeUpdate(); con.commit(); } catch (SQLException e) { try { System.out.println("事务操作失败"); con.rollback(); con.setAutoCommit(true); } catch (SQLException e1) { System.out.println("失败"); e1.printStackTrace(); } } return presql.executeUpdate(); } } ## 目前将SqlRegist类中的insert()方法的代码放入action中不会出现空指针异常并且成功运行, 但是如果按照上面的方式在action中调用insert()方法会出现 RA.getUser().getXxx()出现空值, 请问是为什么,是因为action调用inert方法时候在SqlRegist类中实例化了action对象导致了 原先存储的数据丢失了吗?求大神解答!
JAVA关于类的初步应用
2. 定义一个主类CircleTest,在主类中实现: ① 用无参数Constructor生成一个Circle对象,并调用mutator方法设置radius的值,再输出其面积、周长及直径; ② 用有参数Constructor生成另一个Circle对象,再输出其面积、周长及直径。 我已经按照书本上模仿了一段差不多的代码(应该不会有错) 然后在主类中调用的时候产生了奇怪的问题 :无法从静态上下文中引用非静态变量this class Circle{ private double radius; // private double area; //private double perimeter; private double PI=3.1415; public Circle() { }//空参数 public Circle(double r) { radius=r; } public double mutator(){//设置半径 return radius; } public void accessor(double r){//获取半径 radius=r; } public double area(){ return radius*radius*PI/2; } public double perimeter(){ return 2*radius*PI; } } public static void main(String[] args) { ** Circle radius = new Circle();** ``` ``` 不太明白为啥会出错。。这一步也是模仿课本来的来着。
一个类如何调用其他包中的类的对象?
在Person类中创建了实例p1,为什么在另一个包中的类ObjectArray无法调用? package Person; import MyDate.MyDate; public class Person { public String name; public MyDate brithdate; public String gender,province,city; private static int count=0; public Person(String name,MyDate brithdate,String gender,String province,String city) { this.set(name,brithdate,gender,province,city); count++; } public Person(String name,MyDate brithdate) { this(name,brithdate,"","",""); } public Person() { this("",new MyDate()); } public Person(Person per) { this(per.name,new MyDate(per.brithdate),per.gender,per.province,per.city); } public void finalize() { System.out.println("释放对象("+this.toString()+")"); Person.count--; } public static void howMany() { System.out.print(Person.count+"个Persond对象,"); } public boolean equals(Object obj) { if (this==obj) return true; if (obj instanceof Person) { Person s = (Person)obj; return super.equals(s) && this.name.equals(s.name) && this.brithdate.equals(s.brithdate) && this.gender.equals(s.gender) && this.province.equals(s.province) && this.city.equals(s.city); } return false; } public void set(String name,MyDate brithdate,String gender,String province,String city) ``` ``` { this.name=name==null?"":name; this.brithdate=brithdate; this.gender=gender==null?"":gender; this.province=province==null?"":province; this.city=city==null?"":city; } public void set(String name,MyDate brithdate) { this.set(name, brithdate,"","",""); } public String toString() { return this.name+","+(this.brithdate==null?"":brithdate.toString())+","+this.gender+ ","+this.province+","+this.city; } public static void main(String[] args) { Person p1=new Person("李小明",new MyDate(1994,3,15)); Person p2=new Person(p1); Person.howMany(); System.out.println(); System.out.println("p1:"+p1+";p2:"+p2+"\np1=p2?"+(p1==p2)+";p1.name==p2.name?" +(p1.name==p2.name)+",p1.brithdate==p2.drithdate?" +(p1.brithdate==p2.brithdate)); p2.name="张"+p2.name.substring(1); MyDate date=p2.brithdate; date.set(date.getYear()+2,date.getMonth(),date.getDay()); System.out.println("p1:"+p1+";p2:"+p2); // p1.finalize(); Person.howMany(); System.out.println(); System.out.println(p2.equals(p1)); } } 以上是person类 package ObjectArray; import MyDate.MyDate; import Student.Student; import Person.Person; public class ObjectArray { public static void print(Object[] objs) { if(objs!=null) for(int i=0;i<objs.length;i++) System.out.println(objs[i]==null?"null":objs[i].toString()); } public static Object[] concat(Object[] objs1,Object[] objs2) { if(objs1==null) return objs2; if(objs2==null) return objs1; Object[] result=new Object[objs1.length+objs2.length]; int i=0,j=0; for(j=0;j<objs1.length;j++) result[i++]=objs1[j]; for(j=0;j<objs2.length;j++) result[i++]=objs2[j]; return result; } public static void searchPrintAll(Object[] objs,Object key) { if(objs!=null&&key!=null) for(int i=0;i<objs.length;i++) if(objs[i]!=null&&key.equals(objs[i])) System.out.println(objs[i].toString()); } public static void main(String[] args) { //Person p1=new Person("李小明",new MyDate(1994,3,15)); Person per=new Person("李小明",new MyDate(1994,3,15)); Person[] pers= {per,new Student(p1,"","计算机","",false)}; Student[] stus= {new Student("张莉",new MyDate(1998,4,5),"","","","","信息管理","",false), new Student("朱红",new MyDate(1995,4,5),"","","","","通信工程","",false)}; Object[] objs=concat(pers,stus); stus[1].brithdate.set(new MyDate(2001,10,1)); print(objs); Person[] keys= {new Person(per),new Student((Student)pers[1])}; for(int i=0;i<keys.length;i++) { System.out.println("查找:"+keys[i].toString()+"结果: "); searchPrintAll(objs,keys[i]); } Student.howMany(); } } 以上是ObjectArray类 Person p1=new Person("李小明",new MyDate(1994,3,15));这条语句不注释掉就不报错,注释了的话 Person[] pers= {per,new Student(p1,"","计算机","",false)};这里面的p1老是报错,仿佛这个p1不存在 ``` ```
java的接口可以直接拿来声明变量?
public interface IUserManage { public void addUser(User user); public void modifyUser(User user); public void deleteUser(User user); } 现在有这么个接口,然后在另一个没有实现此接口的类里看到如下这句: private IUserManage userManage; 在这个类里,直接声明了userManage,并且userManage可以直接调用接口里的那三个方法 接口不是只能用来implements实现吗?
关于用DBUtils封装javavbean的问题
为了便于讲的更清楚举个例子。 假如自定义了一个person类如下: class person{        private String name;         private Address address; //以下一系列的getter和setter方法,省略 } 自定义的Address类如下: class Address {        private String city;        private String street; //以下一系列的getter和setter方法,省略​ } 这两个类分别对应两张表。 使用DBUtils可以将基本数据类型的字段封装到javabean 中,若定义的javabean里有的属性类型又是另一个 自定义的javabean的话(例如以上的person类)。 我的问题是:在这种情况下,那么使用DBUtils如何将表数据封装到person中。主要是Address属性。 我的一个解决思路是:先把Address表中数据封装到一个Address javabean中,再手动调用person的setter方法将这个Address对象赋值给person。但是如果javabean中的自定义类型比较多的时候,这样 自己一个一个的调用setter器会很麻烦的。不知道你们是如何解决这个问题的。 没有C币了,抱歉。
从activity调用ViewPager里Fragment的方法传参出现空指针异常?
报错信息如下: FATAL EXCEPTION: main java.lang.RuntimeException: Unable to start activity ComponentInfo{com.thefat.lingjunqi.enricher/com.thefat.lingjunqi.enricher.ActivityReading}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$600(ActivityThread.java:156) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:153) at android.app.ActivityThread.main(ActivityThread.java:5338) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) at dalvik.system.NativeStart.main(Native Method) **Caused by: java.lang.NullPointerException** at com.thefat.lingjunqi.enricher.FragmentArticleEN.refresh(FragmentArticleEN.java:32) at com.thefat.lingjunqi.enricher.ActivityReading.onCreate(ActivityReading.java:103) at android.app.Activity.performCreate(Activity.java:5232) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2272) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)  at android.app.ActivityThread.access$600(ActivityThread.java:156)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:153)  at android.app.ActivityThread.main(ActivityThread.java:5338)  at java.lang.reflect.Method.invokeNative(Native Method)  at java.lang.reflect.Method.invoke(Method.java:511)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)  at dalvik.system.NativeStart.main(Native Method) ActivityReading.class ``` package com.thefat.lingjunqi.enricher; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.util.DisplayMetrics; import android.view.MenuItem; import android.view.View; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; public class ActivityReading extends FragmentActivity { private ViewPager mPager; private ArrayList<Fragment> fragmentsList; private ImageView bottomLine; private TextView textView1, textView2, textView3; private int currIndex = 0; private int bottomLineWidth; private int offset = 0; /*String [] articleTitle; String [] articleContent; String [] transTitle; String [] transContent; String wordsTitle; String [] wordsContent;*/ public static final String ITEM_ID = "item_id"; int color_current; int color_notCurrent; public static void actionStart(Context context, int id){ Intent intent=new Intent(context,ActivityReading.class); intent.putExtra(ActivityReading.ITEM_ID,id); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_reading); mPager = (ViewPager) findViewById(R.id.viewpager); getActionBar().setDisplayHomeAsUpEnabled(true); color_current=getResources().getColor(R.color.color_current); color_notCurrent =getResources().getColor(R.color.color_notcurrent); String [] articleTitle=getResources().getStringArray(R.array.lesson_name_list_en); String []articleContent=getResources().getStringArray(R.array.array_article); String []transTitle=getResources().getStringArray(R.array.lesson_name_list_cn); String []transContent=getResources().getStringArray(R.array.array_trans); String wordsTitle=getResources().getString(R.string.words_title); String []wordsContent=getResources().getStringArray(R.array.array_words); initImageView(); int index=getIntent().getIntExtra(ActivityReading.ITEM_ID,0); textView1 = (TextView) findViewById(R.id.text1); textView2 = (TextView) findViewById(R.id.text2); textView3 = (TextView) findViewById(R.id.text3); textView1.setOnClickListener(new MyOnClickListener(0)); textView2.setOnClickListener(new MyOnClickListener(1)); textView3.setOnClickListener(new MyOnClickListener(2)); final TextView[] titles = {textView1, textView2, textView3}; fragmentsList = new ArrayList<>(); FragmentArticleEN fragmentArticleEN = new FragmentArticleEN(); FragmentArticleCN fragmentArticleCN = new FragmentArticleCN(); FragmentWords fragmentWords = new FragmentWords(); fragmentsList.add(fragmentArticleEN); fragmentsList.add(fragmentArticleCN); fragmentsList.add(fragmentWords); MyFragmentPagerAdapter Pageradapter=new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentsList); mPager.setAdapter(Pageradapter); mPager.setCurrentItem(0); FragmentArticleEN fragmentArticleEN_ = (FragmentArticleEN) Pageradapter.instantiateItem(mPager,0); FragmentArticleCN fragmentArticleCN_ = (FragmentArticleCN) Pageradapter.instantiateItem(mPager,1); FragmentWords fragmentWords_= (FragmentWords) Pageradapter.instantiateItem(mPager,2); fragmentArticleEN_.refresh(articleTitle[index],articleContent[index]); fragmentArticleCN_.refresh(transTitle[index],transContent[index]); fragmentWords_.refresh(wordsTitle,wordsContent[index]); mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { int one=offset*2+bottomLineWidth;//页卡1->页卡2偏移量 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { Animation animation=new TranslateAnimation(one*currIndex,one*position,0,0); animation.setFillAfter(true); animation.setDuration(250); bottomLine.startAnimation(animation); titles[currIndex].setTextColor(color_notCurrent); titles[position].setTextColor(color_current); currIndex=position; } @Override public void onPageScrollStateChanged(int state) { } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { //创建启动ActivityTitle的Intent Intent intent = new Intent(this, ActivityTitle.class); //添加额外的Flag,将Activity栈中处于FirstActivity之上的Activity弹出 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //启动intent对应的Activity startActivity(intent); return true; } return super.onOptionsItemSelected(item); } private void initImageView() { bottomLine = (ImageView)findViewById(R.id.cursor); bottomLineWidth = BitmapFactory.decodeResource(getResources(), R.drawable.cursor).getWidth(); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int screenW_Phone = dm.widthPixels; offset = (screenW_Phone/3 - bottomLineWidth)/2; //imgageview设置平移,使下划线平移到初始位置(平移一个offset) Matrix matrix = new Matrix(); matrix.postTranslate(offset, 0); bottomLine.setImageMatrix(matrix); } public class MyOnClickListener implements View.OnClickListener { private int index = 0; public MyOnClickListener(int i) { index = i; } @Override public void onClick(View v) { mPager.setCurrentItem(index); } } } ``` FragmentArticleEN.class ``` package com.thefat.lingjunqi.enricher; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Created by lingjunqi on 2015/12/2. */ public class FragmentArticleEN extends Fragment { private View view; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view=inflater.inflate(R.layout.fragment_fragment_article_en,container,false); return view; } public void refresh(String title, String content){ View visibilityLayout=view.findViewById(R.id.visibility_layout); visibilityLayout.setVisibility(View.VISIBLE); TextView articleTitleText=(TextView)view.findViewById(R.id.article_titile); TextView articleContentText=(TextView)view.findViewById(R.id.article_content); articleTitleText.setText(title); articleContentText.setText(content); } } ``` **如果我采用的方法错误,谁能告诉一下正确的从一个activity向另一个activity内的ViewPager里的fragment传参或者调用它的方法。**
Java中如何使一个线程进入阻塞态?
<p>按我的理解,当一个线程需要获取的锁被另一个线程占用时,将进入阻塞态。但实际好像不是这样的,下面是我的代码。</p> <p>在run方法中会调用MyBlock的isBlocked方法,该方法添加了synchronized限定。</p> <p>在main方法中创建两个线程:t1和t2,t1运行后,由于isBlocked方法运行需要一定时间,t2应该进入阻塞态。<strong>但我调用getState方法得到的是Runnable,不是Blocked</strong>。</p> <p>这是为啥呢?</p> <p> </p> <pre name="code" class="java">public class TestThread implements Runnable { private String mThreadName = null; private MyLock mLock = null; public TestThread(String name, MyLock l){ mThreadName = name; mLock = l; } @Override public void run() { // TODO Auto-generated method stub subTask(); } private void subTask() { System.out.println(mThreadName + "START!"); mLock.isLocked(); System.out.println(mThreadName + "END!"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyLock lock = new MyLock(); TestThread r1 = new TestThread("A", lock); Thread t1 = new Thread(r1); t1.start(); TestThread r2 = new TestThread("B", lock); Thread t2 = new Thread(r2); t2.start(); System.out.println(t2.getState()); //t2.interrupt(); System.out.println(t2.getState()); System.out.println("MAIN END!"); } public static class MyLock{ private ReentrantLock mLock = new ReentrantLock(); public synchronized void isLocked(){ System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); for (int i = 0; i &lt; 10000; i ++){ System.out.print("," + i); } System.out.println("#############################"); } } }</pre> <p> </p>
对于这段图灵机器人调用代码,我不太理解,可以帮帮我么?
主类 enter code here package zlexample.tuling; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; public class MainActivity extends ActionBarActivity implements HttpGetDataListener { private HttpData data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); data=(HttpData) new HttpData("http://www.tuling123.com/openapi/api?key=cc1dc647bdf0dc4bc7af64edbbda8346&info=+北京", this).execute(); } @Override public void getDataUrl(String data) { // TODO Auto-generated method stub System.out.println(data); //这里的data和上面new的data一样么(我感觉不一样的,因为httpData类中的listener的调用,给data赋值了么???)?????还有着这里重写这个方法干什么的?? //莫非是因为定义了接口就必须重写这个方法??接口实际的作用只是限制了data的数据类型?? } } 另一个类httpData public class HttpData extends AsyncTask<String, Void, String>{ private HttpClient httpClient; private HttpGet httpGet; private String url; private HttpResponse httpResponse; private HttpEntity httpEntity; private InputStream in; private HttpGetDataListener listener; public HttpData(String url,HttpGetDataListener listener) { // TODO Auto-generated constructor stub this.url=url; this.listener=listener; } @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub httpClient=new DefaultHttpClient(); httpGet=new HttpGet(url); try { httpResponse=httpClient.execute(httpGet); httpEntity=httpResponse.getEntity(); in=httpEntity.getContent(); BufferedReader buReader=new BufferedReader(new InputStreamReader(in)); String line=null; StringBuffer stringBuffer = new StringBuffer(); while ((line=buReader.readLine())!=null) { stringBuffer.append(line); } return stringBuffer.toString(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub listener.getDataUrl(result); super.onPostExecute(result); } } 定义的一个接口 package zlexample.tuling; public interface HttpGetDataListener { void getDataUrl(String data); }
在异步任务中无法调用view
在Asynctask类中调用另一个类的view,但是没成功,请帮忙。 异步任务: private class parseSite extends AsyncTask<String, Void, List<Integer>> { protected List<Integer> doInBackground(String... arg) { List<Integer> output = new ArrayList<Integer>(); try { htmlHelper hh = new htmlHelper(new URL(arg[0])); output = hh.htmlHelper(arg[0]); } catch (Exception e) { System.out.println("Error"); } return output; } protected void onPostExecute(List<Integer> exe) { graph salesView = new graph(); View chartView = salesView.getView(this); chartView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT, 1f)); LinearLayout layout = (LinearLayout) findViewById(R.id.linearview); layout.addView(chartView, 0); } } activity的graph: public class graph { public View getView(Context context) (...etc.) 谢谢:-D
java GUI编程函数执行顺序问题
import javax.swing.*; import java.awt.*; import java.io.IOException; import gui.ZJM; public class Bresenham extends JPanel { private int x0; private int y0; private int xEnd; private int yEnd; private boolean temp=false; void setyEnd(int i) { // TODO 自动生成的方法存根 yEnd=i; } void setxEnd(int i) { // TODO 自动生成的方法存根 xEnd=i; } void setY0(int i) { // TODO 自动生成的方法存根 y0=i; } void setX0(int i) { // TODO 自动生成的方法存根 x0=i; } //Graphics g=getGraphics(); @Override public void paintComponent(Graphics g) { //super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; g2d.translate(getWidth() / 2, getHeight() / 2); g2d.scale(1, -1); g2d.drawLine(-400, 0, 400, 0); g2d.drawLine(0, -400, 0, 400); temp=true; //g2d.drawLine(x0, y0, xEnd, yEnd); //Bresline(); } public void setPixel(int x,int y){ Graphics g = getGraphics(); Graphics2D g2d = (Graphics2D)g; g2d.translate(getWidth() / 2, getHeight() / 2); g2d.scale(1, -1); g2d.setColor(Color.RED); g2d.fillOval(x,y,1,1); } static void createAndShowGUI(Bresenham a) { JFrame frame = new JFrame(); // Add your component. frame.setContentPane(a); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(700, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } public void Bresline(){ int dx=Math.abs(xEnd-x0),dy=Math.abs(yEnd-y0); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx = 2*(dy-dx); int x,y; if(x0>xEnd) { x=xEnd; y=yEnd; xEnd=x0;} else { x=x0; y=y0; } setPixel(x,y); while(x<xEnd) { x++; if(p<0) p+=twoDy; else { y++; p+=twoDyMinusDx; } setPixel(x,y); try { Thread.currentThread().sleep(250); } catch(Exception e){} } } public void bresline(int x0,int y0,int xEnd,int yEnd) { Bresenham a = new Bresenham(); a.setX0(x0); a.setY0(y0); a.setxEnd(xEnd); a.setyEnd(yEnd); a.createAndShowGUI(a); a.Bresline(); } public static void main(String[] args) throws IOException { } } 问题1:为什么Bresline函数调用在画出坐标轴之前? 问题 2:如何修改才能在坐标轴上作图 补充:本意是想从另一个类中调用bresline(int,int,int,int)函数来实现作图,但测试的时候发现将x0,y0,yend,xend设为常数后从主函数调用bresline()函数就对了
springCloud项目使用jws开发webservice接口出错的问题,请求大神帮忙
# test类 ``` @WebService @Service public class test{ @Autowired InfDictionaryService infDictionaryService ; @WebMethod(action="execute") public String execute(@WebParam(name = "xmlStr")String xmlStr) { String result = ""; try { result = infDictionaryService.synSalesMsg(xmlStr); } catch (Exception e) { e.printStackTrace(); } System.out.println("返回报文:"+result); return result; } } ``` # 发布服务的类 ``` @Configuration public class BeforeStartUp implements ApplicationListener<ContextRefreshedEvent>{ @Autowired private test testService; private static String address = "http://127.0.0.1:80/ttt"; private static int num =0; @Override public void onApplicationEvent(ContextRefreshedEvent event) { if(num == 0){ Endpoint.publish(address,testService); num ++; } } } ``` # 另一个项目调用webService接口报错,代码如下: ``` public class test { public static void main(String[] args) throws ServiceException{ String wsdl = "http://127.0.0.1:80/ttt?wsdl"; String synSalesMsgXml = "测试数据!"; Service service = new Service(); Call call = (Call) service.createCall(); try { call.setTargetEndpointAddress(wsdl); call.setOperationName("execute"); call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType(XMLType.XSD_STRING); Object[] paramValues = new Object[] {synSalesMsgXml}; String result = (String) call.invoke(paramValues); System.out.println("result is " + result); } catch (Exception e) { e.printStackTrace(); } } } ``` # 报错信息如下 AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client faultSubcode: faultString: 找不到{http://127.0.0.1:80/ttt?wsdl}execute的分派方法 faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:找不到{http://127.0.0.1:80/ttt?wsdl}execute的分派方法 at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1783) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2970) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327) at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at test.main(test.java:67) {http://xml.apache.org/axis/}hostname:MACHENI-S6PC008 找不到{http://127.0.0.1:80/ttt?wsdl}execute的分派方法 at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1783) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2970) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327) at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at test.main(test.java:67)
代码规范器,你们能搞定吗?
<br />一、 代码规范器功能简介 <br />代码规范器根据统一的配置文件,对指定的程序文件进行规范化调整。 <br />配置文件体现了代码规范器的功能,描述了需要对程序文件进行何种统一规范化操作。由于配置文件是统一的,而程序文件却是不确定的,因此不需要把被规范化的程序文件标识放在配置文件中。 <br />随着代码规范器功能的完善,配置文件也将随之更改其格式与填写规范。因此,配置文件应有版本号,以识别其不同的格式与填写规范。 <br />配置文件的形式,可以是XML文件、纯文本文件、数据库等各种形式。但为了扩展性和小巧易用性,建议采用XML文件。配置文件的文件名由代码规范器的设计人员确定,固定不可变更。代码规范器中有且只有一个配置文件。 <br />程序文件类型:JAVA源程序、目标程序。 <br />规范化调整操作分为两类: <br /> 正调整 <br />根据配置文件的设置,在程序文件中的指定位置增加指定的内容。如果程序文件中的指定位置已经有指定的内容,代码规范器不再做增加动作。 <br /> 反调整 <br />根据配置文件的设置,在程序文件中的指定位置删除指定的内容。如果程序文件中的指定位置没有指定的内容,代码规范器不再做删除动作。 <br />二、 代码规范器0.1版功能清单 <br /> 增加类属性 <br />在程序文件类内增加新的属性。 <br />例如: <br />程序文件原来面貌: <br />public class DBCon { <br /> private ResultSet rs; <br /> …… <br />} <br />增加后的程序文件: <br />public class DBCon { <br />private Connection con; <br /> private ResultSet rs; <br /> …… <br />} <br /> 增加类方法及代码 <br />在程序文件类中增加新方法及代码。 <br />例如: <br />程序文件原来面貌: <br />public class DBCon { <br /> private ResultSet rs; <br /> …… <br />} <br />增加后的程序文件: <br />public class DBCon { <br />private ResultSet rs; <br />public DBCon() throws Exception { <br /> connection(); <br />} <br /> …… <br />} <br /> 在类方法内指定位置增加代码 <br />在程序文件类中指定的方法内的指定位置,增加代码。 <br />在方法内的指定位置,分为两种:方法内的最前部和最后部。 <br />三、 代码规范器使用方法 <br />代码规范器的使用方法有两种: <br /> 命令行方式 <br />格式:代码规范器 程序文件 调整操作分类 <br /> 其中,调整操作分类  “+”表示正调整 <br />“-”表示负调整 <br />例如,代码规范器的文件名为BUILD.EXE,程序文件的文件名TEST.JAVA,准备进行正调整,则命令行执行方式为:“BUILD TEST.JAVA +”。 <br /> 接口调用方式 <br />接口调用方式是提供给应用程序调用的方式。应用程序通过实例化代码规范器封装好的一个类,然后调用其中的指定方法,将需要进行调整的程序文件文件名和调整操作分类传递给该方法,实现对程序文件的调整。 <br />四、 要求 <br />编写、提交设计文档、源代码、目标代码。另需附一个通过接口调用方式的例子代码。 <br /> <br /> <br /> <br />一家公司笔试的题目,各位可以给点意见吗? <br />
关于Spring boot + SpringSecurity +jwt token失效的问题
比如我登abc的用户,然后我在另一个地点也登abc的用户,那前一个登陆的在刷新或者请求接口的时候要登出, 或者是我后台改了abc的密码,那abc这个账户在刷新请求接口的时候要登出。 框架我搭好了 代码如下: 生成token工具类: ``` public class JwtTokenUtil { private static InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("jwt.jks"); // 寻找证书文件 private static PrivateKey privateKey = null; private static PublicKey publicKey = null; static { // 将证书文件里边的私钥公钥拿出来 try { KeyStore keyStore = KeyStore.getInstance("JKS"); // java key store 固定常量 keyStore.load(inputStream, "123456".toCharArray()); privateKey = (PrivateKey) keyStore.getKey("jwt", "123456".toCharArray()); // jwt 为 命令生成整数文件时的别名 publicKey = keyStore.getCertificate("jwt").getPublicKey(); } catch (Exception e) { e.printStackTrace(); } } public static String generateToken(String subject, int expirationSeconds, String salt) { return Jwts.builder() .setClaims(null) .setSubject(subject) .setExpiration(new Date(System.currentTimeMillis() + expirationSeconds * 1000)) // .signWith(SignatureAlgorithm.HS512, salt) // 不使用公钥私钥 .signWith(SignatureAlgorithm.RS256, privateKey) .compact(); } public static String parseToken(String token, String salt) { String subject = null; try { Claims claims = Jwts.parser() // .setSigningKey(salt) // 不使用公钥私钥 .setSigningKey(publicKey) .parseClaimsJws(token).getBody(); subject = claims.getSubject(); } catch (Exception e) { } return subject; } } ``` 登陆成功后生成JTWtoken : ``` @Component public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { ResponseBase responseBase = new ResponseBase(); responseBase.setCode("200"); responseBase.setMassage("Login Success!"); String jwtToken = JwtTokenUtil.generateToken(String.valueOf(authentication.getPrincipal()), 300, "_secret"); responseBase.setJwtToken(jwtToken); httpServletResponse.getWriter().write(JSON.toJSONString(responseBase)); } } ``` 监听器: ``` @Component public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Autowired AdminSysUserSecurityService adminSysUserSecurityService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String authHeader = request.getHeader("Authorization"); if (authHeader != null && authHeader.startsWith("Bearer ")) { final String authToken = authHeader.substring("Bearer ".length()); String username = JwtTokenUtil.parseToken(authToken, "_secret"); if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { UserDetails userDetails = adminSysUserSecurityService.loadUserByUsername(username); if (userDetails != null) { UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); SecurityContextHolder.getContext().setAuthentication(authentication); } } } chain.doFilter(request, response); } } ``` ``` @Component("rbacauthorityservice") public class RbacAuthorityService { public boolean hasPermission(HttpServletRequest request, Authentication authentication) { Object userInfo = authentication.getPrincipal(); boolean hasPermission = false; if (userInfo instanceof UserDetails) { String username = ((UserDetails) userInfo).getUsername(); //获取资源 Set<String> urls = new HashSet(); urls.add("/**/**"); // 这些 url 都是要登录后才能访问,且其他的 url 都不能访问! Set set2 = new HashSet(); Set set3 = new HashSet(); AntPathMatcher antPathMatcher = new AntPathMatcher(); for (String url : urls) { if (antPathMatcher.match(url, request.getRequestURI())) { hasPermission = true; break; } } return hasPermission; } else { return false; } } } ``` 配置: ``` @Configuration public class AdminWebSecurityConfig extends WebSecurityConfigurerAdapter { @Value("${pay.strength}") private int strength; @Autowired private AdminSysUserSecurityService adminSysUserSecurityService; @Bean public PasswordEncoder passwordEncoder(){ // return NoOpPasswordEncoder.getInstance();//不对密码加密 return new BCryptPasswordEncoder(strength);//秘钥迭代次数为 2^strength,strength取值在 4-31 之间,默认10 } @Autowired AjaxAuthenticationEntryPoint authenticationEntryPoint; // 未登陆时返回 JSON 格式的数据给前端(否则为 html) @Autowired AjaxAuthenticationSuccessHandler authenticationSuccessHandler; // 登录成功返回的 JSON 格式数据给前端(否则为 html) @Autowired AjaxAuthenticationFailureHandler authenticationFailureHandler; // 登录失败返回的 JSON 格式数据给前端(否则为 html) @Autowired AjaxLogoutSuccessHandler logoutSuccessHandler; // 注销成功返回的 JSON 格式数据给前端(否则为 登录时的 html) @Autowired AjaxAccessDeniedHandler accessDeniedHandler; // 无权访问返回的 JSON 格式数据给前端(否则为 403 html 页面) @Autowired JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; // JWT 拦截器 @Autowired SelfAuthenticationProvider provider; // 自定义安全认证 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 加入自定义的安全认证 auth.authenticationProvider(provider); } @Override public void configure(HttpSecurity http)throws Exception{ //开启HttpSecurity配置 http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 使用 JWT,关闭token .and() .httpBasic().authenticationEntryPoint(authenticationEntryPoint) .and() .authorizeRequests() // .antMatchers("/db/**").hasRole("DB") // .antMatchers("/user/**").hasRole("USER") // .antMatchers("/admin/**").hasRole("ADMIN") // .antMatchers("/user/**").access("hasAnyRole('ADMIN','ROOT')") // .antMatchers("/db/**").access("hasAnyRole('ADMIN') and hasRole('DBA')") //除了前面路径,用户访问其他URL都必须认证后访问 .anyRequest() .access("@rbacauthorityservice.hasPermission(request,authentication)") // RBAC 动态 url 认证 .and() //开启表单登录,同事配置了登入接口为/login .formLogin() /* //该接口主要方便ajax或者移动端登入 .loginProcessingUrl("/login") //设置登录成功跳转页面,error=true控制页面错误信息的展示 .successForwardUrl("/index").failureUrl("/login?error=true") */ //登入接口都不需要认证 .successHandler(authenticationSuccessHandler) // 登录成功 .failureHandler(authenticationFailureHandler) // 登录失败 .permitAll() .and() //开启注销登入配置 .logout() .logoutSuccessHandler(logoutSuccessHandler) .permitAll(); http.rememberMe().rememberMeParameter("remember-me") .userDetailsService(adminSysUserSecurityService).tokenValiditySeconds(300); http.exceptionHandling().accessDeniedHandler(accessDeniedHandler); // 无权访问 JSON 格式的数据 http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); // JWT Filter } ``` 登陆成功后获取token,postman测试: ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576056718_177252.png) 可以 但是我重新调用新的登陆接口,相同用户名获取新的token后,原来的token依旧可以请求。 所以要在哪边配置 用户其它地方登陆,或者用户密码变更,jtwtoken失效
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
相关热词 c# id读写器 c#俄罗斯方块源码 c# linq原理 c# 装箱有什么用 c#集合 复制 c# 一个字符串分组 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图
立即提问