質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2580閲覧

static参照できません

syosinsya

総合スコア13

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

1クリップ

投稿2014/10/19 09:29

androidのプログラミングをJavaで行っているのですが、2つのソースコードで文字を受け渡すのがうまくいきません。
MainActivityで暗号文を復号をするときにAESUtil.decryptを使っています。
MainActivityで入力したEditTextをAESUtilENCRYPTION_KEYに入れます。
aeskeyはEditTextの入力のたびにそのときの文字列を代入したいのですが、
aeskeyが最初に入力した文字列のままになってしまいます。
finalを外せばいいのかなと思ったのですが、staticが参照できませんなどとエラーが出て、解決できませんでした。

lang

1public enum AESUtil { 2 3 static final String ENCRYPTION_KEY = MainActivity.aeskey; 4//中略 5static Key makeKey() { 6 try { 7 MessageDigest md = MessageDigest.getInstance("SHA-256"); 8 byte[] key = md.digest(aeskey.getBytes("UTF-8")); 9 return new SecretKeySpec(key, "AES"); 10 } catch (NoSuchAlgorithmException e) { 11 e.printStackTrace(); 12 } catch (UnsupportedEncodingException e) { 13 e.printStackTrace(); 14 } 15 16 return null; 17}

MainAvtivityのコード

lang

1//この上にはアラートダイアログを書いてます 2@Override 3 public void onClick(DialogInterface dialog,int which) { 4 EditText editText = (EditText) view.findViewById(R.id.editText1); 5 String aeskey = editText.getText().toString(); 6_

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

static final String ENCRYPTION_KEY = MainActivity.aeskey;
...
String aeskey = editText.getText().toString();
...

まずは ↑ のようなコードで ENCRYPTION_KEY と aeskey を関係つけられると思っているというのが問題です。
少なくとも final と宣言すると、その変数は内容を変更することはできなくなることも理解している事が必要です。

1つのソースファイルですが、次のコードが動作することが理解できますでしょうか?
Sample.java

lang

1enum AESUtil { 2 FOO, 3 BAR; 4 5 public static String key = "abc"; 6 static void sub() { 7 System.out.println(key); 8 } 9} 10 11class Sample { 12 public static void main(String args[]) { 13 AESUtil.sub(); 14 AESUtil.key = "123"; 15 AESUtil.sub(); 16 } 17}

$ javac Sample.java
$ java Sample
のようにして、実際の動作を確認してみてください。

実は class や enum 中の変数を外から直接 変更するというのは好ましくありません。
いつ、どこで その変数が変更されたかをコントロールすることが困難になるからです。
上のコードや少なくとも次のように書くのが好ましいです。

lang

1enum AESUtil { 2 FOO, 3 BAR; 4 5 private static String key = "abc"; // 外部からの 直接の変更は不可とする。 6 public static void set_key(String val) { 7 key = val; 8 } 9 static void sub() { 10 System.out.println(key); 11 } 12} 13 14class Sample { 15 public static void main(String args[]) { 16 AESUtil.sub(); 17 AESUtil.set_key("123"); // AESUtil.key = "123"; 18 AESUtil.sub(); 19 } 20}

以上を踏まえたうえで、質問にあった部分のコードを見直すと 問題が解消すると思います。

投稿2014/10/19 10:30

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syosinsya

2014/10/20 03:10

回答ありがとうございます。問題が解決しました。 変数ENCRYPTION_KEYのfinalを消して、ENCRYPTION_KEYを引数にしている所にコードを追加したら、上手くいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問